leetcode--populating_next_right_pointers_in_each_node

leetcode–populating_next_right_pointers_in_each_node

題意:給定一個二叉樹結構,

public class TreeLinkNode {
    int val;
    TreeLinkNode left, right, next;
    TreeLinkNode(int x) { val = x; }
 }

每一個節點添加一個指針next(如上),指向該節點所在層中右邊的節點,如果該節點右邊沒有其他節點,則將next指向null,開始時所有節點的next指針都是null。

條件: 1.只能常數的空間; 2.假設這是一棵完美二叉數(所有的葉子節點在同一層並且每一個父節點都有兩個孩子)。

舉例:給定如下的完美二叉樹

      1
     / \
   2   3
  / \ / \
 4 5 6 7

執行後該樹應該如下圖所示

        1 -> NULL
     /     \
   2   ->   3 -> NULL
 /  \       /    \
4->5->6->7 -> NULL

分析:本題第一反應是使用廣度優先遍歷然後再結合滿二叉樹的性質(左孩子節點=2×父親節點)來做。但是本題要求只能使用常數空間複雜度,廣度優先遍歷需要使用隊列,不符合要求。
使用層次遍歷,增加一個指針previous,指向已經構造好的當前層,假設已經構造好了第2層,則指向第2層的2節點,現在需要構造第3層:

   2 -> 3 -> NULL
  / \    / \
4   5  6   7

增加一個指針present,指向當前需要構造的層。此時只需要遍歷一遍第二層,在遍歷到2時,將4節點的next設置爲5,present指針指向5節點,previous節點向後移一個,此時previous指向3節點,它的左右孩子節點爲6、7。將5節點的next設置爲6節點,present指針向後移一位指向6節點,再將6節點的next設置爲7節點,present指針再向後移一位指向7節點。由於初始所有節點的next指針均爲NULL,所以第3層到這裏就構造完畢。如果後面還有其他層的話,只需要將previous指針指向第3層的4節點,present指針指向第4層,以此類推執行即可。

代碼

public void connect(TreeLinkNode root) {
        if(root == null){
            return;
        }else{
            TreeLinkNode previous = root; 
            TreeLinkNode present = null;
            TreeLinkNode head = null;
            while(previous.left != null){
                while(previous != null){
                    if(present == null){
                        present = previous.left;
                        present.next = previous.right;
                        head = present;
                        present = present.next;
                        previous = previous.next;
                    }else{
                        present.next = previous.left;
                        present = present.next;
                        present.next = previous.right;
                        present = present.next;
                        previous = previous.next;
                    }
                }
                previous = head;            //previous指向下一層
                present = null;             //present指向下一層
            }
        }
    }

源程序下載

總結:使用該方法不用額外的創建太多空間,只需要創建3個指針即可,而且用上一層構建下一層這種方法也可以實現二叉樹的層次遍歷(不是滿二叉樹也可以這麼做,不過需要加上判斷條件,一般的層次遍歷使用兩個隊列實現)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章