填充每個節點的下乙個右側節點指標

2021-10-17 11:41:31 字數 3014 閱讀 6848

給定乙個完美二叉樹,其所有葉子節點都在同一層,每個父節點都有兩個子節點。二叉樹定義如下:

public class node
填充它的每個 next 指標,讓這個指標指向其下乙個右側節點。如果找不到下乙個右側節點,則將 next 指標設定為 null。初始狀態下,所有 next 指標都被設定為 null。

高階:

示例:

解法一:二叉樹的遍歷時講過層序遍歷,其實這個題目可以借鑑二叉樹的層序遍歷的思路來進行解決。其實從上面的示例中可以看出,就是進行二叉樹的層序遍歷,同時把遍歷到的節點從左到右依次連線即可,此種解法比較簡單,直接上**

public node connect(node root) 

queuequeue = new linkedlist<>();

queue.add(root);

while (!queue.isempty())

// 拓展下一層節點

if (node.left != null)

if (node.right != null) }}

return root;

}

此種解法的時間複雜度為o(n),空間複雜度為o(n)。

解法二:題目中限定了樹是一顆完美二叉樹,即每一層的節點都是滿的,同時高階中要求在o(1)的空間複雜度內解決,仔細分析樹的連線方式,有兩種連線方式。

第一種:如下圖中的 4 和 5,節點具有相同的父節點 root,此種節點的連線方式比較簡單,直接執行 root.left.next => root.right

第二種:如下圖中的節點 5 和 節點 6,此種節點沒有相同的父節點,但是從圖中我們可以發現 

(1)此次串聯的兩個節點恰好是上一層的 root.right節點 和n2.left節點

(2)由圖克重root.next == n2

(3)經(1)和(2)分析,即轉換為root.right.next => root.next.left,所以這裡我們需要保證root.next不為空就可以

(4)經過前面三步的分析和下圖表明,當我們要串聯第 i 層節點時,需要先完成第 i-1 層的節點串聯

(5)所以我們每一次找到每一層的最左側節點(記住是一顆完美二叉樹),依次執行連線即可。

(6)經過上面的分析,**如下。

public node connect1(node root) 

//leftnodeforlevel表示每一層的最左側節點,初始化為root

node leftnodeforlevel = root;

//只需要leftnodeforlevel.left不等於空,表示還有下一層節點

while (leftnodeforlevel.left != null)

//需要後移乙個節點

head = head.next;

}//繼續處理下一層

leftnodeforlevel = leftnodeforlevel.left;

}return root;

}

解法三:遞迴實現。其實就是把每一層相鄰的節點串聯起來,那如何定義遞迴函式?以及如何通過找到相鄰的節點?

(1)可以定義乙個遞迴函式connecttwonode(node node1,node node2)表示串聯起給定的兩個節點,如下面的2 和 3。

(2)首先給定的兩個節點肯定是要直接相連起來

(3)兩個節點的left 節點和 right 節點肯定也要相連起來

(4)經過前面三步的分析,其實我們發現,只需要把node1 的 right 和 node2 的 left  節點相連起來就可以了。

(5)當然遞迴的終止條件是node1 為空 或者 node2 為空,經過上面的分析,即遞迴函式connecttwonode的定義如下。

public node connect2(node root) 

/*** 定義:輸入兩個節點,將它倆連線起來

** @param node1

* @param node2

*/public void connecttwonode(node node1, node node2)

// 首先傳入的兩個節點肯定需要連線

node1.next = node2;

// 傳入的兩個節點的左右孩子也是得連線

connecttwonode(node1.left, node1.right);

connecttwonode(node2.left, node2.right);

// 傳入的第乙個節點的right節點和第二個節點的left節點也是得連線

connecttwonode(node1.right, node2.left);

}

255 填充每個節點的下乙個右側節點指標

題目描述 給定乙個完美二叉樹,其所有葉子節點都在同一層,每個父節點都有兩個子節點。二叉樹定義如下 struct node 填充它的每個 next 指標,讓這個指標指向其下乙個右側節點。如果找不到下乙個右側節點,則將 next 指標設定為 null。初始狀態下,所有 next 指標都被設定為 null...

116 填充每個節點的下乙個右側節點指標

給定乙個完美二叉樹,其所有葉子節點都在同一層,每個父節點都有兩個子節點。二叉樹定義如下 struct node 填充它的每個 next 指標,讓這個指標指向其下乙個右側節點。如果找不到下乙個右側節點,則將 next 指標設定為 null。初始狀態下,所有 next 指標都被設定為 null。示例 你...

116 填充每個節點的下乙個右側節點指標

將每個節點與右邊的節點建立next關係,你只能使用常量級額外空間。使用遞迴解題也符合要求,本題中遞迴程式占用的棧空間不算做額外的空間複雜度。兩種方法,bfs和遞迴 方法一 遞迴 class solution def connect self,root def dfs root if not root...