【算法题】二叉树的下一个结点

题目描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

分析
暴力求解法:根据父结点指针找到根结点,进行中序遍历找到下一个结点即可,时间复杂度O(n)。
根据几种情况下的分析,时间复杂度可优化到O(L),L为该结点与后继结点在树中的实际距离。
1)如果该结点有右孩子,则找到右孩子的最左叶子结点返回;
2)如果该结点是父结点的左孩子,则将父结点返回;
3)如果该结点是父结点的右孩子,则继续向上查找(循环1~3),直到父结点为空,表示该结点没有后继结点。

代码


class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;

    TreeLinkNode(int val) {
        this.val = val;
    }
}

public class Solution {
    public TreeLinkNode GetNext(TreeLinkNode pNode) {
        if(pNode==null) return null;
        if(pNode.right!=null){
            TreeLinkNode tmp = pNode.right;
            while(tmp.left!=null) tmp=tmp.left;
            return tmp;
        }
        while(pNode.next!=null){
            if(pNode==pNode.next.left) return pNode.next;
            pNode=pNode.next;
        }
        return null;
    }
}
原创文章 28 获赞 22 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Steven_L_/article/details/105943313