給每一個結點新增向右的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指標
- LeetCode-117-填充每個節點的下一個右側節點指標 IILeetCode指標
- LeetCode117-填充每個節點的下一個右側節點指標 IILeetCode指標
- 劍指offer——兩個連結串列的第一個公共結點C++C++
- 《劍指offer》:[58]二叉樹的下一個結點二叉樹
- leetcode 876. 連結串列的中間結點(快慢指標法)LeetCode指標
- 基於DDD知識揭示Go中結構指標兩個優點Go指標
- Jquery 給Js動態新新增的元素 繫結的點選事件jQueryJS事件
- 利用快慢指標快速得到連結串列中間節點指標
- Java連結串列指標確實好煩 - 交換連結串列中連續的兩個節點的位置Java指標
- 聊聊經典資料結構HashMap,逐行分析每一個關鍵點資料結構HashMap
- ofbiz的幾個問題,希望用過的高手給點指點
- 指標問題的一點體會(區別 [指向指標的指標] 與 [指標的指標] .) (轉)指標
- c 連結串列之 快慢指標 查詢迴圈節點指標
- 【連結串列問題】打卡8:複製含有隨機指標節點的連結串列隨機指標
- 一點總結
- 在做一個support,今天看程式碼的過程中遇到個問題,望大家給點指點。
- 指標總結指標
- jQuery的一點小結jQuery
- Duplicate的一點總結
- ash的一點總結
- 劍指offer面試題15 連結串列中倒數第K個結點面試題
- 交換二叉樹中每個結點的左孩子和右孩子二叉樹
- C語言第7題:指標總結(兩張表格重點***)C語言指標
- Qt/C++路徑軌跡回放/回放每個點訊號/回放結束訊號/拿到移動的座標點經緯度QTC++
- 一點ASMM總結ASM
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- 使用繫結變數的一點總結!變數
- html連結的一點技巧HTML
- clickhouse使用的一點總結
- flashback database的一點總結Database
- rowid的一點總結!
- 前端每週清單年度總結與盤點前端
- 【c語言】把一個長整型給一個字元指標C語言字元指標
- 給XML檔案新增新的節點XML