一、二叉树的下一个结点:

1、题目:

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

2、解题思路:

分析二叉树的下一个节点,一共有以下情况:
(1)二叉树为空,则返回空;
(2)节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;
(3)节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重复第三步的判断,返回结果。

3、代码实现:

public class Test15 {public TreeLinkNode GetNext(TreeLinkNode pNode){if(pNode == null){return null;}if(pNode.right != null){pNode = pNode.right;while(pNode.left!=null){pNode = pNode.left;}return pNode;}while(pNode.next!=null){TreeLinkNode parent = pNode.next;if(parent.left==pNode){return parent;}pNode = pNode.next;}return null;}
}class TreeLinkNode {int val;TreeLinkNode left = null;TreeLinkNode right = null;TreeLinkNode next = null;//指向改节点的父节点TreeLinkNode(int val) {this.val = val;}
}

二、对称二叉树:

1、题目:

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

2、解题思路:

最简单的方式可以使用递归方式,但是使用递归无法挖掘这道题的价值,因此我们可以使用DFS和BFS。

3、代码实现:

(1)第一种:递归算法:

①只要pRoot.left和pRoot.right是否对称即可。

②左右节点的值相等且对称子树left.left,right.right ;left.rigth,right.left也对称。

public class Test16 {boolean isSymmetrical(TreeNode pRoot){if(pRoot == null) return true;return judge(pRoot.left,pRoot.right);}boolean judge(TreeNode leftNode,TreeNode rightNode){if(leftNode == null) return rightNode==null;if(rightNode == null) return false;if(leftNode.val != rightNode.val) return false;return judge(leftNode.left,rightNode.right) && judge(leftNode.right,rightNode.left);}}class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}

(2)第二种方法:DFS深度优先遍历:

DFS使用stack来保存成对的节点,

①出栈的时候也是成对成对的:

若都为空,继续;

一个为空,返回false;

不为空,比较当前值,值不等,返回false;

②确定入栈顺序,每次入栈都是成对成对的,如left.left,right.right ;left.rigth,right.left

 boolean isSymmetrical2(TreeNode pRoot){//第二种方法:使用深度遍历:利用Stack实现if(pRoot==null) return true;Stack<TreeNode> stack = new Stack<>();//入栈和出栈都需要成对stack.push(pRoot.left);stack.push(pRoot.right);while(!stack.isEmpty()){//成对取出TreeNode right = stack.pop();TreeNode left = stack.pop();if(left==null && right==null) continue;if(left==null ||right==null) return false;if(left.val!=right.val) return false;//成对入栈:stack.push(left.left);stack.push(right.right);stack.push(right.left);stack.push(left.right);}return true;}

(3)第三种方法:BFS广度优先遍历:

BFS使用Queue来保存成对的节点,代码和上面极其相似

①出队的时候也是成对成对的

若都为空,继续;

一个为空,返回false;

不为空,比较当前值,值不等,返回false;

②确定入队顺序,每次入队都是成对成对的,如left.left,right.right ;left.rigth,right.left。

 boolean isSymmetrical3(TreeNode pRoot){//第三种方法:使用广度遍历:使用队列实现if(pRoot==null) return true;Queue<TreeNode> queue = new LinkedList<>();queue.offer(pRoot.left);queue.offer(pRoot.right);while(!queue.isEmpty()){//成对取出TreeNode right = queue.poll();TreeNode left = queue.poll();if(left ==null && right ==null) continue;if(left==null || right==null) return false;if(left.val != right.val) return false;//成对插入queue.offer(left.left);queue.offer(right.right);queue.offer(left.right);queue.offer(right.left);}return true;}

三、按之字性顺序打印二叉树:

1、题目:

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

2、解题思路:

利用栈先进后出的性质,创建两个栈分别存放奇数层与偶数层的节点。

3、代码实现:

public class Test18 {public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {int layer = 1;//s1存奇数层节点:Stack<TreeNode> s1 = new Stack<TreeNode>();s1.push(pRoot);//s2存放偶数层节点:Stack<TreeNode> s2 = new Stack<TreeNode>();ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();while(!s1.empty() || !s2.empty()){if(layer%2 !=0){//奇数层:ArrayList<Integer> temp = new ArrayList<Integer>();while(!s1.empty()){TreeNode node = s1.pop();if(node!=null){temp.add(node.val);s2.push(node.left);s2.push(node.right);}}if(!temp.isEmpty()){list.add(temp);layer++;}}else{//偶数层:ArrayList<Integer> temp = new ArrayList<Integer>();while(!s2.isEmpty()){TreeNode node = s2.pop();if(node!=null){temp.add(node.val);s1.push(node.right);s1.push(node.left);}}if(!temp.isEmpty()){list.add(temp);layer++;}}}return list;}
}class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}

四、把二叉树打印成多行:

1、题目:

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

2、代码实现:

public class Test19 {ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();if(pRoot == null){return result;}Queue<TreeNode> queue = new LinkedList<TreeNode>();ArrayList<Integer> queueList = new ArrayList<Integer>();queue.add(pRoot);int start = 0 ,end = 1;while(!queue.isEmpty()){TreeNode current = queue.remove();queueList.add(current.val);start++;if(current.left!=null){queue.add(current.left);}if(current.right!=null){queue.add(current.right);}if(start == end){end = queue.size();start=0;result.add(queueList);queueList = new ArrayList<Integer>();}}return result;}
}class TreeNode {int val = 0;TreeNode left = null;TreeNode right = null;public TreeNode(int val) {this.val = val;}
}

《剑指offer》-- 二叉树的下一个结点、对称二叉树、按之字性顺序打印二叉树、把二叉树打印成多行相关推荐

  1. 剑指offer——面试题58:二叉树的下一个结点

    剑指offer--面试题58:二叉树的下一个结点 这个题要认真分析一下... Solution1: 自己想出来的破算法 /* struct TreeLinkNode {int val;struct T ...

  2. java 二叉树的深度、平衡二叉树、二叉树的下一个结点

    1. 二叉树的深度 1. 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2. 求解思路 可以用后序遍历,从最后一层 ...

  3. 《剑指offer》c++版本 8.二叉树的下一个结点

    如题: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点 的指针. 这道题目考察对二叉树中序遍历的理解,做题的时候,如果没 ...

  4. 剑指offer之二叉树的下一个结点

    1 问题 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针 2 分析 比如我现在的二叉树如下 42 61 3 5 7 ...

  5. 剑指offer值二叉树的下一个结点

    题目简介 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 解题思路 该题目主要考察对二叉树中序遍历规律的理解和分 ...

  6. 剑指offer(C++)-JZ8:二叉树的下一个结点(数据结构-树)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结 ...

  7. 剑指offer面试题[58]-二叉树的下一个结点

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. /* struct TreeLinkNode {int ...

  8. 剑指offer(18) 二叉树的下一个结点

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. setsail 分析二叉树的下一个节点,一共有以下情况 ...

  9. 【打卡第243道】【二叉树】【剑指Offer】:JZ8 二叉树的下一个结点

    1.题目描述 2.算法分析 既然是找中序遍历的某一个结点的下一个结点,其实思路已经很明确了.     1.将二叉树中序遍历,存储到集合中.前提,首先找到根节点.根节点可以根据指向父节点的next指针找 ...

最新文章

  1. Nginx 学习笔记(六)引入线程池 性能提升9倍
  2. jQuery EasyUI DataGrid 分页 FOR ASP.NET
  3. CentOS 编译 openjdk
  4. https://www.adminsub.net/tcp-udp-port-finder/14000 ——查找tcp端口对应的服务 可以看某些端口是否让恶意软件开启...
  5. Eclipse报错 due to restriction on required library C:/Java/jdk1.6.0_10/jre/lib/rt.jar 解决方案
  6. 华为虚拟一键部署服务器,一键部署云服务器
  7. Metropolis Hastings MCMC when the proposal and target have differing support
  8. 问题四十八:怎么用ray tracing画superhyperboloid(超级双曲面)
  9. tensorflow安装中踩到的坑protobuf、h5py、tensorboard、werkzeug
  10. web显示实时时间动态刷新
  11. java mis系统_关于使用Java开发Mis系统
  12. 【APICloud系列|32】 aMapNavigation高德地图导航的实现
  13. Oracle 18C RAC安装利用iSCSI实现部署
  14. html5 励志名言,5个字的励志名言
  15. Bolt: Anonymous Payment Channels for Decentralized Currencies 学习笔记
  16. Matlab多if语句(if,elseif,else)分段执行时遇到被上一个条件覆盖的问题及解决
  17. 国内不翻墙调用chatgpt api
  18. [转]马化腾:如何从“较好”到“最好”
  19. 工作中常用的JS函数整理分享(欢迎大家补充)
  20. 公众号服务号自定义菜单获取code

热门文章

  1. 六十六,完成SpringBoot项目中的员工增删查改功能
  2. 悉尼大学 伦敦大学联合出品:知识蒸馏最新综述
  3. 今日arXiv精选 | 15篇EMNLP 2021最新论文
  4. 三连冠!百度PARL 拿下NeurIPS 2020电网调度竞赛双赛道冠军
  5. ICCV 2019 论文解读 | 基于层次解析的Image Captioning
  6. 任务导向型对话系统——对话管理模型研究最新进展
  7. 近期我们在读的那些优质论文,你不了解下?
  8. NLP多任务学习:一种层次增长的神经网络结构 | PaperDaily #16
  9. stm32延时us寄存器_STM32延时函数的四种方法
  10. 4.MyBatis全局配置文件SqlMapConfig.xml