《剑指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
原创粉丝点击