二叉樹的下一個節點

題目描述

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

/*
public class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;

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

思路

要求中序遍歷的下一個節點,那麼首先須要對節點進行分類,哪些節點的下一個節點是是父節點,哪些節點的下一個節點與子節點有關
圖片描述
圖片描述
上圖將節點分紅了三類,實際上咱們能夠根據紅色箭頭的指向,分紅兩類,紫色和橙色的節點爲一類,藍色的爲一類this

  • 紫色和橙色節點:共同點都是自己沒有右孩子。spa

    • 若是自己又是父節點的左孩子,那麼下一個節點就是父節點
    • 若是自己不是父節點的左孩子,那麼繼續尋找,直到找到一個祖先是某個節點a的左孩子,那麼下一個節點就是節點a
  • 藍色節點:該節點有右孩子指針

    • 該節點的右孩子沒有左孩子:下一個節點就是該節點的右孩子
    • 該節點的右孩子還有左孩子:下一個節點就是該節點的右孩子的左孩子,若是左孩子還有左孩子,就繼續遍歷,直到遇到最後一個左孩子就是下一個節點

感受文字描述有點囉嗦,下面直接看代碼,總而言之就是將節點分紅了兩大類(根據有沒有右孩子),而後每一個大類又分紅了兩個小類code

public TreeLinkNode GetNext(TreeLinkNode pNode)
    {
        if(pNode==null) return null;
        if(pNode.right!=null){    //若是有右子樹,則找右子樹的最左節點
            pNode = pNode.right;
            while(pNode.left!=null) pNode = pNode.left;
            return pNode;
        }
        while(pNode.next!=null){ //沒右子樹,則找第一個當前節點是父節點左孩子的節點
            if(pNode.next.left==pNode) return pNode.next;
            pNode = pNode.next;
        }
        return null;   //退到了根節點仍沒找到,則返回null
    }

總結

本題的關鍵點在於畫出中序遍歷的圖,發現規律,將節點進行分類
歡迎關注:小秋的博客
圖片描述圖片

相關文章
相關標籤/搜索