剑指offer给定二叉树,求中序遍历的下一个 节点,前序遍历,后序遍历扩展
来源:互联网 发布:mac上的视频剪辑软件 编辑:程序博客网 时间:2024/06/04 18:54
题目链接https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e?tpId=13&tqId=11210&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
如有更优的解法:欢迎提点
/*public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; TreeLinkNode(int val) { this.val = val; }} *//* * * 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。 *注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 * *中序遍历:先左子树,后根节点,再右子树 *前序遍历:先根节点,后左子树,再右子树 *后序遍历:先左子树,后右子树,再根节点。 * * * A * / \ * B C * / \ / \ *D E F G * / \ * H I * * DBHEIAFCG----中序遍历 * ABDEHICFG----前序遍历 * DHIEBFGCA----后序遍历 */public class Solution22 {/* * 中序遍历 思路: * (1) 若该节点存在右子树:则下一个节点为右子树最左子节点(如图节点 B ) * (2) 若该节点不存在右子树:这时分两种情况: * 2.1 该节点为父节点的左子节点,则下一个节点为其父节点(如图节点 D ) * 2.2该节点为父节点的右子节点,则沿着父节点向上遍历,直到找到一个节点的父节点的左子节点为该节点, 则该节点的父节点下一个节点(如图节点 I,沿着父节点一直向上查找找到 B ( B 为其父节点的左子节点),则 B 的父节点 A 为下一个节点)。 */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 proot = pNode.next;// 该节点是父节点的左子节点,返回父节点if (proot.left == pNode) {return proot;}// 改节点是父节点的右子树,向上继续找到直到该节点是父节点的左子节点if (proot.right == pNode) {pNode = proot;}}// 直到为根节点时,则返回nullreturn null;}/** * 前序遍历 * 1.只有根节点时,节点为空时(节点A) * 2.有左子节点时,直接返回左子节点 * 3.无左子节点时,向上遍历父节点知道得到右子节点 * 这里有一个特殊情况,就是当该节点本身就是右子节点时,需要保存自身,在往上遍历 * * */public TreeLinkNode GetNextbyFirst(TreeLinkNode pNode) {if (pNode == null) {return null;}// 只有根节点的情况(节点A)if (pNode.next == null && pNode.left == null && pNode.right == null) {return null;}// 如果有左子节点,直接返回(节点BCE)if (pNode.left != null) {return pNode.left;}// 标记当前节点TreeLinkNode p = pNode;// 当前节点无左子节点时,while (pNode != null) {// 如果有右子节点,则返回右子节点,否则往上找父节点的兄弟if (pNode.right != p && pNode.right != null) {return pNode.right;} else {p = pNode;pNode = pNode.next;}}return null;}/** * 后序遍历--左右根 * * * * */public TreeLinkNode GetNextbyLast(TreeLinkNode pNode) {if (pNode == null || pNode.next == null) {return null;}// 该节点为右子树上的节点,且该节点无子节点,则后序遍历的下一个节点是该节点的父节点if (pNode.left == null && pNode.right == null) {// 该节点为父节点的左子节点if (pNode.next.left == pNode) {// 该节点无右兄弟if (pNode.next.right == null) {return pNode.next;}// 该节点有右兄弟子树else {// 找到最左子节点pNode = pNode.next.right;while (pNode != null) {// 左子节点不为空if (pNode.left != null) {pNode = pNode.left;}// 左子节点为空,右子节点不为空else if (pNode.right != null) {pNode = pNode.right;}// 左右子节点都为空else {return pNode;}}}}}// 该节点为父节点的左子节点if (pNode.left != null && pNode.right != null&& pNode.next.left == pNode) {// 该节点无右兄弟if (pNode.next.right == null) {return pNode.next;}// 该节点有右兄弟子树else {// 找到最左子节点pNode = pNode.next.right;while (pNode != null) {// 左子节点不为空if (pNode.left != null) {pNode = pNode.left;}// 左子节点为空,右子节点不为空else if (pNode.right != null) {pNode = pNode.right;}// 左右子节点都为空else {return pNode;}}}}// 该节点为父节点的右子节点,则返回父节点,节点I,if (pNode.next.right == pNode) {return pNode.next;}return pNode;}public static void main(String[] args) {TreeLinkNode A = new TreeLinkNode("A");TreeLinkNode B = new TreeLinkNode("B");TreeLinkNode C = new TreeLinkNode("C");TreeLinkNode D = new TreeLinkNode("D");TreeLinkNode E = new TreeLinkNode("E");TreeLinkNode F = new TreeLinkNode("F");TreeLinkNode G = new TreeLinkNode("G");TreeLinkNode H = new TreeLinkNode("H");TreeLinkNode I = new TreeLinkNode("I");A.next = null;A.left = B;A.right = C;B.next = A;B.left = D;B.right = E;D.next = B;D.left = D.right = null;E.next = B;E.left = H;E.right = I;H.next = E;H.left = H.right = null;I.next = E;I.left = I.right = null;C.next = A;C.left = F;C.right = G;F.next = C;F.left = F.right = null;G.next = C;G.left = G.right = null;// * DBHEIAFCG----中序遍历// * ABDEHICFG----前序遍历// * DHIEBFGCA----后序遍历// try {// Solution22 s22 = new Solution22();// TreeLinkNode p1 = s22.GetNext(A);// System.out.println("p1=="+p1.val);// TreeLinkNode p2 = s22.GetNextbyFirst(I);// System.out.println("p2=="+p2.val);// } catch (Exception e2) {// System.out.println("null");// }Solution22 s22 = new Solution22();TreeLinkNode p2 = s22.GetNextbyLast(D);// System.out.println(""+p2);while (p2 != null) {try {System.out.println("p2==" + p2.val);p2 = s22.GetNextbyLast(p2);} catch (Exception e2) {// TODO: handle exceptionSystem.out.println("null");}}}}
1 0
- 剑指offer给定二叉树,求中序遍历的下一个 节点,前序遍历,后序遍历扩展
- 二叉树 给定一个节点,求中序遍历下一个节点
- 给定一个二叉树和其中的一个节点,求中序遍历这个节点的下一个节点
- 剑指offer:找到二叉树中序遍历的下一个节点
- 剑指Offer-根据二叉树的前序和后序遍历重建二叉树
- 58 - 二叉树的中序遍历的下一个节点
- 二叉树的遍历(前序遍历、中序遍历、后序遍历)
- 二叉树的遍历 前序遍历 中序遍历 后序遍历
- 二叉树的遍历:前序遍历、中序遍历和后序遍历
- 扩展二叉树 建立 以及 前序遍历 中序遍历 后序遍历 的非递归算法
- 剑指offer 23----二叉树的前序、中序、后序、层序遍历
- 剑指offer面试题:输入某二叉树的前序遍历和中序遍历的结果,输出后序遍历结果。
- 判断给定数组是否是二叉树的前序或者后序遍历结果
- 剑指offer:二叉搜索树的后序遍历序列
- 【剑指offer】二叉搜索树的后序遍历序列
- 剑指offer--二叉搜索树的后序遍历序列
- 剑指Offer-->二叉搜索树的后序遍历序列
- 《剑指offer》二叉搜索树的后序遍历序列
- Favoring Curry
- 程序编译,链接过程
- Linux学习笔记21 --文本处理工具
- C#基于SharpPcap数据包捕获软件开发实例
- Xcode git版本控制忽略无关文件
- 剑指offer给定二叉树,求中序遍历的下一个 节点,前序遍历,后序遍历扩展
- 删除mysql-bin引起的数据库无法启动的问题
- Laravel 5.2 使用 JWT 完成多用户认证
- 分针网—IT教育: 关于全局变量不能全局的问题
- 小试牛刀---清华大学THULAC中文词法分析工具包
- 九度1008:最短路径问题(Dijkstra)
- Read_ArrayList
- java-自动装箱与自动拆箱
- 干货分享!DevExpressv16.2最新版演示示例等你来收!(上)