日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Leetcode 116. 填充每个节点的下一个右侧节点指针 解题思路及C++实现

發布時間:2025/4/16 c/c++ 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode 116. 填充每个节点的下一个右侧节点指针 解题思路及C++实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

方法一:層序遍歷(這是比較暴力愚蠢的方法)

解題思路:

這里使用層序遍歷訪問這顆完美二叉樹,使用的是兩個棧,而不是兩個隊列,因為這樣在遍歷每一層并指定next指針時會更方便一些,但是要注意的一點是,循環內的臨時棧s2 是先push右子節點,再push左子節點。s2中節點順序是反過來的,所以要依次pop到s1中。

?

/* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() {}Node(int _val, Node* _left, Node* _right, Node* _next) {val = _val;left = _left;right = _right;next = _next;} }; */ class Solution { public:Node* connect(Node* root) {if(root == NULL) return root;//層序遍歷stack<Node*> s1;s1.push(root);while(!s1.empty()){stack<Node*> s2;Node* temp1 = NULL;Node* temp2 = NULL;while(!s1.empty()){temp1 = s1.top();s1.pop();temp1->next = temp2;temp2 = temp1;if(temp1->left){s2.push(temp1->right);s2.push(temp1->left);}}//s2中節點順序是反過來的while(!s2.empty()){s1.push(s2.top());s2.pop();}}return root;} };

?

?

方法二:技巧型

解題思路:

因為是一顆完美二叉樹,所以,對于某個節點來說,其左子節點的next指針直接指向其右子節點即可,右子節點指向其父節點next指針所指節點的左子節點,若其父節點next指針為null,則該右子節點的next也指向null。

但是遞歸耗時費內存啊!

/* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() {}Node(int _val, Node* _left, Node* _right, Node* _next) {val = _val;left = _left;right = _right;next = _next;} }; */ class Solution { public:Node* connect(Node* root) {if(root == NULL) return root;if(root->left) root->left->next = root->right;if(root->right) {if(root->next) root->right->next = root->next->left;}root->left = connect(root->left);root->right = connect(root->right);return root;} };

?

?

?

總結

以上是生活随笔為你收集整理的Leetcode 116. 填充每个节点的下一个右侧节点指针 解题思路及C++实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。