《剑指offer》-- 二叉树的下一个结点
来源:互联网 发布:丑陋的中国人知乎 编辑:程序博客网 时间:2024/05/01 18:57
题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路:
/**
* 思路:
*
* 对于一个节点,其后续节点有三种形式:
* 1. 该节点的右指针为null,那么就往前找其父节点(设为a),
* 若a是其父节点的左子节点,那么下一个节点就是a的父节点,否则,就一直往上找,找到该节点为其父节点的左节点位置;
* 如果一直找到了跟节点(即其父节点为null),那么久返回null
* 2. 该节点是的右指针不为null,那么找其右子树的第一个节点
*
*/
本道题目不难,树遍历基本的三种方式,本道题的以上思路,可以综合在一个代码当中完成,也可以分功能到不同的函数内部,这是两种小细节的处理方式,我是使用的第二种,即在寻找右子树中序遍历下的第一个节点时,递归调用。
code:
/** * 题目描述 * * 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 * * date: 2016.4.2 10:53 * @author SSS * */public class Solution { public TreeLinkNode GetNext(TreeLinkNode pNode) { TreeLinkNode resultNode = null; // 总体情况分为该节点右指针是否为0,若不为null,那么其下一个节点一定在右子树上,否则就要往上寻找 if (pNode.right != null) { resultNode = getFirstNodeOfInOrder(pNode.right); } else { // 往上找 TreeLinkNode parentNode = pNode.next; TreeLinkNode tempNode = pNode; while(parentNode != null) { if (parentNode.left == tempNode) { // 该节点为父节点的左节点,那么父节点就是中序遍历的下一个节点 resultNode = parentNode; break; } else { // 否则就一直往上遍历 tempNode = parentNode; parentNode = parentNode.next; } } // 这种情况是一直遍历到整个树的根节点 if (parentNode == null) { resultNode = null; } } return resultNode; } /** * 在中序遍历下,找到该节点的下一个节点,前提是当前节点是非空 * @param node * @return */ public TreeLinkNode getFirstNodeOfInOrder(TreeLinkNode node) { TreeLinkNode resultNode = node; if(node.left == null) { return node; } resultNode = getFirstNodeOfInOrder(node.left); return resultNode; } /* public static void main(String []args) { Solution solution = new Solution(); TreeLinkNode rootNode = new TreeLinkNode(4); TreeLinkNode aNode = new TreeLinkNode(23); TreeLinkNode bNode = new TreeLinkNode(12); rootNode.left = aNode; rootNode.right = bNode; aNode.next = rootNode; bNode.next = rootNode; TreeLinkNode cNode = new TreeLinkNode(1); TreeLinkNode dNode = new TreeLinkNode(65); aNode.left = cNode; aNode.right = dNode; cNode.next = aNode; dNode.next = aNode; TreeLinkNode eNode = new TreeLinkNode(234); TreeLinkNode fNode = new TreeLinkNode(64); bNode.left = eNode; bNode.right = fNode; eNode.next = bNode; fNode.next = bNode; TreeLinkNode resultNode = solution.GetNext(bNode); if (resultNode != null) { System.out.println(resultNode.val); } else { System.out.println("null"); } }*/}
0 0
- 剑指offer--二叉树的下一个结点
- 《剑指offer》二叉树的下一个结点
- 《剑指offer》-- 二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- [剑指offer]二叉树的下一个结点
- 剑指offer-二叉树的下一个结点
- 《剑指offer》二叉树的下一个结点
- 剑指offer: 二叉树的下一个结点
- 剑指offer 二叉树的下一个结点
- 剑指offer-二叉树的下一个结点
- 【剑指offer】二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- 剑指offer--二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- 剑指offer 二叉树的下一个结点
- 题录 endnote 导入 NoteExpress
- 【BZOJ2246】[SDOI2011]迷宫探险【搜索】【概率DP】
- Android学习笔记---第二天---基础UI组件---Toast
- 构造方法(构造函数)
- c#HttpWebRequest修改cookie
- 《剑指offer》-- 二叉树的下一个结点
- 关于Yeoman安装的学习笔记
- Java HashCode 详解
- Linux 手册 —— 管道
- 鹅厂2016实习校园招聘笔试——基础研究
- Android签名相关知识整理
- 字符串包含问题
- 7.1 Android Framework - ViewAnimation
- C语言中如何解决重复include的问题