Leetcode 116. 填充每个节点的下一个右侧节点指针 解题思路及C++实现
生活随笔
收集整理的這篇文章主要介紹了
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++实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode 114. 二叉树展开为
- 下一篇: Leetcode 117. 填充每个节点