《剑指offer》-- 二叉树的下一个结点
2016-04-03 09:32
477 查看
题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路:
/**
* 思路:
*
* 对于一个节点,其后续节点有三种形式:
* 1. 该节点的右指针为null,那么就往前找其父节点(设为a),
* 若a是其父节点的左子节点,那么下一个节点就是a的父节点,否则,就一直往上找,找到该节点为其父节点的左节点位置;
* 如果一直找到了跟节点(即其父节点为null),那么久返回null
* 2. 该节点是的右指针不为null,那么找其右子树的第一个节点
*
*/
本道题目不难,树遍历基本的三种方式,本道题的以上思路,可以综合在一个代码当中完成,也可以分功能到不同的函数内部,这是两种小细节的处理方式,我是使用的第二种,即在寻找右子树中序遍历下的第一个节点时,递归调用。
code:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路:
/**
* 思路:
*
* 对于一个节点,其后续节点有三种形式:
* 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"); } }*/ }
相关文章推荐
- Spark ListenerBus 和 MetricsSystem 体系分析(引用)
- 1.js基础
- BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
- 10分钟-jQuery动画特效
- js笔记(10)之无缝滚动
- (OK) 运行cBPM in Fedora23
- 通过CSS3,实现元素覆盖效果
- (OK) 运行cBPM—Fedora23
- (OK) Install codeblocks_16.01 on Fedora23
- seajs 2.3.0 加入jquery
- javascript-5.面向对象(回车事件驱动)
- Javascript快速入门
- (OK) CORE nodes access Internet—虚拟节点访问互联网—commands
- (OK) running imunes in Fedora 23
- html5入门
- 【JQuery】delay()方法
- basket.js 源码分析
- javascript中的作用域和预解析
- caffe编译通过
- a毛 jquery 学习记 2(下) 基础核心