給每一個結點新增向右的next指標結點
版權宣告:本文為博主原創文章,轉載請註明出處。
個人部落格地址:https://yangyuanlin.club
歡迎來踩~~~~
- Populating Next Right Pointers in Each Node
Given a binary tree
struct TreeLinkNode {
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
}
Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.
Initially, all next pointers are set toNULL.
Note:
- You may only use constant extra space.
- You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).
For example,
Given the following perfect binary tree,
1
/ \
2 3
/ \ / \
4 5 6 7
After calling your function, the tree should look like:
1 -> NULL
/ \
2 -> 3 -> NULL
/ \ / \
4->5->6->7 -> NULL
-
題目大意:題目給出了二叉樹的資料結構,要求給每一個結點新增
next
指標結點,指標指向右邊的下一個結點。如果沒有下一個右邊結點,next
指標應該被設定為指向NULL
。提示:(1)只能使用固定的額外空間;(2)假設二叉樹都是完美的二叉樹(即,所有的葉子都在同一層上,而且每個父結點都有兩個孩子結點)。
就像例子中給出的就是完美二叉樹。
在呼叫完成的函式後,二叉樹的結構變成了上面那樣。
-
思路:仔細考慮題目要求,發現是在同一層上進行操作,應該想到用層次法對二叉樹進行操作,思路如下,判斷當前節點如果不是葉子結點,說明他有兩個孩子結點,將左孩子結點指向右孩子結點,再判斷該結點有沒有
next
結點,如果有,那他也有兩個孩子結點,就可以把當前結點的右孩子結點指向next
結點的左孩子結點,然後再判斷next
結點的情況,判斷完這一層的,再去判斷下一層。當然還有遞迴的思想就比較簡單了。
程式碼:(遞迴)
// Definition for binary tree with next pointer.
struct TreeLinkNode {
int val;
TreeLinkNode *left, *right, *next;
TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
};
class Solution {
public:
// 遞迴
void connect(TreeLinkNode *root) {
if(root == NULL) return; //當前節點存在
// 當前結點不是葉子結點,那必然就有兩個結點,就讓左孩子結點的next指向右孩子結點
if(root->left!=NULL&&root->right!=NULL)
root->left->next=root->right;
// 當前結點不是葉子結點,且有next結點
if(root->right!=NULL&&root->next!=NULL)
root->right->next=root->next->left;
connect(root->left); // 遞迴判斷左子樹的情況
connect(root->right); // 遞迴判斷右子樹的情況
}
};
(非遞迴)
// Definition for binary tree with next pointer.
struct TreeLinkNode {
int val;
TreeLinkNode *left, *right, *next;
TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {}
};
class Solution {
public:
// 非遞迴
void connect(TreeLinkNode *root) {
TreeLinkNode *r = root;
while(r && r->left){ // 結點非空,且存在孩子結點(左右結點判斷一個就好,一個有就都有)
TreeLinkNode *cur = r;
while(cur && cur->left){ // 結點非空,且存在孩子結點(左右結點判斷一個就好,一個有就都有)
// 讓當前結點的左孩子結點的next指向當前結點的右孩子結點
cur->left->next = cur->right;
// 如果當前結點有next結點,
// 就讓當前結點的右孩子結點的next指向當前結點的next結點的左孩子結點
// (當前結點有孩子結點,說明當前節點的next結點也必有孩子結點)
cur->right->next = cur->next == NULL ? NULL : cur->next->left;
// 層序向右
cur = cur->next;
}//while
// 層序向下
r = r->left;
}//while
}
};
- 以上。
版權宣告:本文為博主原創文章,轉載請註明出處。
個人部落格地址:https://yangyuanlin.club
歡迎來踩~~~~
相關文章
- 填充每個節點的下一個右側節點指標指標
- 填充每個節點的下一個右側節點指標 II指標
- 116. 填充每個節點的下一個右側節點指標指標
- LeetCode-116-填充每個節點的下一個右側節點指標LeetCode指標
- LeetCode117-填充每個節點的下一個右側節點指標 IILeetCode指標
- LeetCode-117-填充每個節點的下一個右側節點指標 IILeetCode指標
- 【劍指offer】【3】輸入一個連結串列,從尾到頭列印連結串列每個節點的值。
- 劍指offer——兩個連結串列的第一個公共結點C++C++
- 連結串列中的節點每k個一組翻轉
- leetcode 876. 連結串列的中間結點(快慢指標法)LeetCode指標
- 兩個連結串列的第一個公共結點
- 基於DDD知識揭示Go中結構指標兩個優點Go指標
- 劍指Offer-38-兩個連結串列的第一個公共節點
- 劍指offer——連結串列中倒數第k個結點
- 聊聊經典資料結構HashMap,逐行分析每一個關鍵點資料結構HashMap
- JZ-036-兩個連結串列的第一個公共結點
- 【連結串列問題】打卡8:複製含有隨機指標節點的連結串列隨機指標
- 力扣 - 劍指 Offer 52. 兩個連結串列的第一個公共節點力扣
- jQuery的一點小結jQuery
- 兩個連結串列的第一個公共節點
- (轉發)連結串列新增函式中為什麼要用指向連結串列指標的指標(引用傳參)函式指標
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- C語言第7題:指標總結(兩張表格重點***)C語言指標
- Qt/C++路徑軌跡回放/回放每個點訊號/回放結束訊號/拿到移動的座標點經緯度QTC++
- 交換二叉樹中每個結點的左孩子和右孩子二叉樹
- 【LeetCode】【連結串列】劍指 Offer 52. 兩個連結串列的第一個公共節點 思路解析和程式碼LeetCode
- html連結的一點技巧HTML
- clickhouse使用的一點總結
- 前端每週清單年度總結與盤點前端
- 知識點:樹中結點的度以及葉子結點(度為0的結點)的計算
- 看過這個,你可能更瞭解指標一點(2)指標
- 連結串列倒數第k個結點
- 劍指offer:給定一棵二叉搜尋樹,請找出其中的第k小的結點。
- [連結串列]leetcode1019-連結串列中的下一個更大節點LeetCode
- 總結的小知識點(一)
- 用一個儘可能高效的演算法,查詢單向連結串列(有頭結點)中倒數第k個位置上的結點演算法
- 「複製帶隨機指標的連結串列」的一個很巧妙解法隨機指標
- 調和葉狀結構--一個有趣的公式(觀點)公式