美文网首页
剑指Offer第8题——二叉树的下一个节点

剑指Offer第8题——二叉树的下一个节点

作者: wuhuaguo丶 | 来源:发表于2019-04-05 17:24 被阅读0次
    给出一棵二叉树和其中一个节点,如果找出中序遍历序列的下一个节点,树中的节点除了有两个分别指向左右子节点的指针,还有一个指向父节点的指针。
    private class TreeLinkNode {
            int val;
            TreeLinkNode left = null;
            TreeLinkNode right = null;
            // next指向父结点
            TreeLinkNode next = null;
    
            TreeLinkNode(int val) {
                this.val = val;
            }
        }
    

    首先明确思路:中序遍历规则:左根右


    虚线为中序遍历下一个节点

    总结:总体分成两种情况:

    1. 节点有右子树的:下一个节点指的是该节点右子树最左边的点。(eg:D,B,E,A,C,G)
    2. 节点无右子树的,又分两种情况:
      1. 没有右子树且该节点是父节点的左孩子(eg:N,I,L)那么父节点为该节点的下一个节点。
      2. 没有右子树且该节点是父节点的右孩子(eg:H,J,K,M),那么迭代找该节点的父节点。直到当前节点是其父节点的左孩子。那么左孩子的父节点为下一节点。如果迭代到顶端依然没有左孩子的情况,则为尾节点。eg:M。
        public TreeLinkNode getNext(TreeLinkNode pNode) {
            // 如果该节点的的右子树不为空
            if (pNode.right != null) {
                pNode = pNode.right;
                while (pNode.left != null) {
                    pNode = pNode.left;
                }
                return pNode;
            }
            // 如果右子树为空,则找其父节点,当父节点的右子树为该节点时,继续向上找
            while (pNode.next != null && pNode.next.right == pNode) {
                pNode = pNode.next;
            }
            return pNode.next;
        }
    

    相关文章

      网友评论

          本文标题:剑指Offer第8题——二叉树的下一个节点

          本文链接:https://www.haomeiwen.com/subject/ngckiqtx.html