该帖主要对二叉树的常见算法题进行总结,也是方便查看,具体的题目要求和思路可以点开链接查看,欢迎大家指点。

1 二叉树的前序遍历
(1)访问根节点;
(2)递归遍历左子树;
(3)递归遍历右子树;

递归前序遍历
public void preTraversal(Node node){if (node != null) {  System.out.print(node.val+" ");preTraversal(node.left);preTraversal(node.right);}}
非递归前序遍历:
public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();if(root==null){return list;}Stack<TreeNode> stack = new Stack<>();stack.push(root);while(!stack.isEmpty()){TreeNode res = stack.pop();if(res.right != null)stack.push(res.right);if(res.left != null)stack.push(res.left);list.add(res.val);}return list;}

2 中序遍历:
(1)遍历左子树;
(2)访问根节点;
(3)遍历右子树

递归:
public void  MidTraversal(Node node){if (node != null) {  MidTraversa(node.left);System.out.print(node.val+" ");MidTraversa(node.right);}}
非递归:
public List<Integer> inorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<>();if(root==null){return list;}Stack<TreeNode> stack = new Stack<>();TreeNode curr = root;while(curr != null || !(stack.isEmpty())){if(curr!= null){stack.push(curr);curr = curr.left;}else{curr = stack.pop();list.add(curr.val);curr = curr.right;}}return list;}

3 后序遍历:
(1)采用后序递归遍历左子树;
(2)采用后序递归遍历右子树;
(3)访问根节点;

递归:
public void postTraversal(Node node){if (node != null) { postTraversal(node.left);postTraversal(node.right);System.out.print(node.val+" ");}}

4 层次遍历(广度优先)

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res = new ArrayList<List<Integer>>();List<TreeNode> quene = new ArrayList<TreeNode>();if(root == null){return res;}quene.add(root);while(quene.size()!=0){int count = quene.size();List<Integer> list = new ArrayList<Integer>();while(count>0){TreeNode temp =quene.remove(0);                   list.add(temp.val);if(temp.left!=null){quene.add(temp.left);}if(temp.right!=null){quene.add(temp.right);} count--;}res.add(list);}return res;}
}

5 二叉树的最大深度

public int maxDepth(TreeNode root) {if(root==null){return 0;}int left = maxDepth(root.left);int right = maxDepth(root.right);return Math.max(left,right)+1;}

6 二叉树的镜像

public void Mirror(TreeNode root) {if(root!=null){if(root.left!=null || root.right!= null){TreeNode temp =root.left;root.left=root.right;root.right=temp;}Mirror(root.left);Mirror(root.right);}}

7 对称二叉树


boolean isSymmetrical(TreeNode pRoot){if(pRoot == null)return true;return real(pRoot.left,pRoot.right);}public boolean real(TreeNode root1,TreeNode root2){if(root1 == null && root2 == null){return true;}if(root1 ==null || root2 == null){return false;}if(root1.val != root2.val){return false;}return real(root1.left,root2.right)&&real(root1.right,root2.left);

8 路径总和

public class Solution {private ArrayList<Integer> list = new ArrayList<Integer>();private ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {if(root == null)return listAll;list.add(root.val);target -= root.val;if(target == 0 && root.left==null && root.right == null){listAll.add(new ArrayList<Integer>(list));}FindPath(root.left,target);FindPath(root.right,target);list.remove(list.size()-1);return listAll;}
}

9 重建二叉树

 public TreeNode reConstructBinaryTree(int [] pre,int [] in) {return reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);}public TreeNode reConstructBinaryTree(int [] pre,int startpre,int endpre,int [] in,int startin,int endin){if(startpre > endpre || startin > endin){return null;}TreeNode root = new TreeNode(pre[startpre]);for(int i =startin;i<=endin;i++){if(in[i] == pre[startpre]){root.left = reConstructBinaryTree(pre,startpre+1,startpre+i-startin,in,startin,i-1);root.right = reConstructBinaryTree(pre,startpre+i-startin+1,endpre,in,i+1,endin);}}return root;}

10 二叉搜索树的后序遍历序列

public boolean VerifySquenceOfBST(int [] sequence) {if(sequence.length==0)return false;int len = sequence.length-1;return split(sequence,0,len);}public boolean split(int [] sequence,int start,int end){if(start>=end)return true;int center = start;while(sequence[center]<sequence[end]&&center<end){center++;}for(int i=center;i<end;i++){if(sequence[i]<sequence[end]){return false;}}return split(sequence,start,center-1)&&split(sequence,center,end-1);}

11 二叉搜索树的最近公共祖先

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null || root == p || root == q){return root;}TreeNode left = lowestCommonAncestor(root.left,p,q);TreeNode right = lowestCommonAncestor(root.right,p,q);if(left!=null && right!=null){return root;}return left!=null?left:right;}
}

12 二叉树的序列化和反序列化

序列化:
public String serialize(TreeNode root) {if (root == null) {return null;}// 利用二叉树的层次遍历方式进行序列化StringBuilder res = new StringBuilder();LinkedList<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {TreeNode node = queue.remove();if (node != null) {res.append(node.val).append(",");queue.add(node.left);queue.add(node.right);} else {res.append("null,");}}return res.toString();}
反序列化:
public TreeNode deserialize(String data) {if (data == null || data.length() == 0) {return null;}String[] dataArr = data.split(",");// 层次遍历逆向还原二叉树int index = 0;TreeNode root = toNode(dataArr[index]);LinkedList<TreeNode> queue = new LinkedList<>();queue.add(root);while (index < dataArr.length - 2 && !queue.isEmpty()) {TreeNode cur = queue.remove();// 添加左子节点TreeNode leftNode = toNode(dataArr[++index]);cur.left = leftNode;// 队列中的节点用于为其赋值孩子节点,若该节点本身为 null,// 没有孩子节点,便不再添加到队列中,下同理if (leftNode != null) {queue.add(leftNode);}// 添加右子节点TreeNode rightNode = toNode(dataArr[++index]);cur.right = rightNode;if (rightNode != null) {queue.add(rightNode);}}return root;}private TreeNode toNode(String val) {if (!"null".equals(val)) {return new TreeNode(Integer.parseInt(val));} else {return null;}}

二叉树常见算法总结(java)相关推荐

  1. 【算法】二叉树常见算法

    [算法]-- 二叉树常见算法 目录 一.单值二叉树 二.相同的树 三.另一棵树的子树 四.对称二叉树 五.判断完全二叉树 一.单值二叉树 1. 问题描述 如果二叉树每个节点都具有相同的值,那么该二叉树 ...

  2. 二叉树常见算法题(单值二叉树、二叉树的最大深度、反转二叉树、判断两颗二叉树是否相同、对称二叉树、一颗二叉树是否是另一颗二叉树的子树)

    这里的代码都是递归实现的,再强调下二叉树的概念,二叉树的构成有两种情况: 1.空树 2.根节点 + 左子树 + 右子树(这里的左子树和右子树又是一颗二叉树) 可以看出二叉树就是递归定义的,下面的算法题 ...

  3. 二叉树排序算法(java)

    二叉树 主要包括根节点,左孩子和右孩子 二叉排序的基本原理: 把第一个元素作为根节点,之后的元素如果比第一个元素大,放到右面,否则放到左面 算法步骤 先声明一个节点类Node,里面有根节点,左孩子和右 ...

  4. 大学常见算法的java实现及思考-汉诺塔问题

    大家好,本人是2010级计算机学院学生一枚.今年暑假希望同大家一起对大学所有讲过的算法进行一次细致的回顾.在此我会把回顾的点点滴滴记下,希望对大家有些帮助.本人也是菜鸟一枚,如在表述中有不对的希望大家 ...

  5. 算法(Java)——动态规划

    算法相关数据结构总结: 序号 数据结构 文章 1 动态规划 动态规划之背包问题--01背包 动态规划之背包问题--完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 ...

  6. Java面试常见算法

    在程序员的职业生涯中,算法亦算是一门基础课程,尤其是在面试的时候,很多公司都会让程序员编写一些算法实例,例如快速排序.二叉树查找等等. 本文总结了程序员在代码面试中最常遇到的10大算法类型,想要真正了 ...

  7. Java尚硅谷基础笔记-day4数组-数组常见算法

    第三章 数组 3.4 数组中涉及的常见算法 3.1 数组的概述 3.2 一维数组的使用 3.3 多维数组的使用 3.4 数组中涉及的常见算法 3.5 数组工具类的使用 3.6 数组使用中的常见异常 3 ...

  8. 【LeetCode-面试算法经典-Java实现】【226-Invert Binary Tree(反转二叉树)】

    [226-Invert Binary Tree(反转二叉树)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 代码下载[https://github.com/Wang-Jun- ...

  9. 【树】二叉树遍历算法(深度优先、广度优先遍历,前序、中序、后序、层次)及Java实现...

    [树]二叉树遍历算法(深度优先.广度优先遍历,前序.中序.后序.层次)及Java实现 目录 一.前序遍历 二.中序遍历 三.后序遍历 四.层次遍历 遍历的作用 二叉树是一种非常重要的数据结构,很多其它 ...

  10. 【Java】包装类 正则表达式 Arrays类 常见算法 泛型

    包装类         其实就是8种基本数据类型对应的引用类型 Java为了实现一切皆对象,为了8种基本类型提供了对应的引用类型 后面的集合和泛型其实也只是支持包装类型,不支持基本数据类型 自动装箱: ...

最新文章

  1. LeetCode 42. Trapping Rain Water--算法题--c++解法
  2. 如何将您的#100DaysOfCode登录转换为视觉体验
  3. java外部类_Java里什么叫内部类什么叫外部类
  4. Problem 25
  5. Odoo12 添加新项目安装后无法在菜单中看到链接的解决方案
  6. [bzoj2594][Wc2006]水管局长数据加强版
  7. Spring Security Oauth2系列(一)
  8. Matlab - Matlab 2016a 安装破解教程
  9. 收发短信AT指令详解
  10. 偏见:人工智能辅助决策的隐患
  11. mysql卸载安装pxc_PXC 5.7.14 安装部署
  12. Openbravo3.0 客户端代码开发与API
  13. excel之countifs函数
  14. 不同域名间的session共享
  15. 四川2008省选·洛谷·奖励关
  16. win10定时关机c语言,win10系统通过命令实现定时关机的操作方法
  17. 苹果cms-v10后台一键采集豆瓣api获取资料(更新版)
  18. 如何让MenuBar的菜单栏靠右对齐?
  19. 支付宝pc端支付回调处理
  20. JUDE/Professional中文版

热门文章

  1. redis04-----Hash 哈希数据类型相关命令
  2. 深入理解计算机系统(2.7)------二进制小数和IEEE浮点标准
  3. 中概股“回A”政策趋紧 霞客环保终止卖壳
  4. JDK-Logger
  5. 转:程序员最值得关注的10个C开源项目
  6. Reset Image Size 2
  7. 用户空间与内核空间数据交换的方式(3)------seq_file
  8. SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEM...
  9. 如何配置和使用Tomcat访问日志
  10. 1. JavaScript 与 PHP 的语法区别