二叉樹的下一個中序節點

題目描述

給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。

分析

  • 如果有右子樹:那就是右子樹的最左節點
  • 如果沒有右子樹:向上找祖先,如果它是該祖先的左子孫,則是; 如果找不到,那本身就是最後一個節點,下一個是null

代碼

public class TreeLinkNode {
    public int val;
    public TreeLinkNode left = null;
    public TreeLinkNode right = null;
    public TreeLinkNode next = null; //指向父節點
    public TreeLinkNode(int val)
    { this.val = val;
    }
}
public TreeLinkNode getNext(TreeLinkNode n){
        if (n==null)return null;
        if (n.right!=null){//有右子樹:找右子樹最左節點
            TreeLinkNode left = n.right;
            while (left.left!=null)left= left.left;
            return left;
        }else{//沒有右子樹,找爲其左子孫的第一個祖先。
            TreeLinkNode father = n;
            while (father!=null){
                if (father.next!=null && father.next.left == father)return father.next;
                father = father.next;
            }
            return null;//找不到,那它本身就是最後一個,下一個是null
        }
}

擴展思考

如果是前序,怎麼找?

  • 有左子節點,就是左子節點
  • 沒有左子節點:
    • 有右子節點:就是右子節點
    • 沒有右子節點(葉節點):向上找,找祖先的右子節點(異己的)

如果是後序,怎麼找?
後序說明當前節點的子節點都在自己前面,只有父節點在自己後面。

  • 如果沒有父節點(根節點):下一個是null
  • 有父節點:
    • 父節點右子節點是自己或者爲空:下一個就是父節點
    • 父節點右子節點不爲空且不是自己(即作爲左節點):找該右子樹的最左節點
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章