Leetcode每日一题(中等)2641.二叉树的堂兄弟节点
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* replaceValueInTree(TreeNode* root) {
struct TreeNode ans;
root->val = 0;
vector<TreeNode*> q = {root};
while(!q.empty()){
vector<TreeNode*> nxt;
int next_sum = 0;
for(auto node: q){
if(node->left){
nxt.push_back(node->left);
next_sum += node->left->val;
}
if(node->right){
nxt.push_back(node->right);
next_sum += node->right->val;
}
}
for(auto node:q){
int children_sum = (node->left?node->left->val:0) + (node->right?node->right->val:0);
if(node->left) node->left->val = next_sum - children_sum;
if(node->right) node->right->val = next_sum - children_sum;
}
q = move(nxt);
}
return root;
}
};
根据参考答案写的,主要思路是用一层一层遍历的方法遍历整个二叉树,其中q为指针指向根节点,通过node变量得到下一层的根节点,并将下一层节点的值的和相加,减去子节点的值,即为堂兄弟节点的值的和,再将q指针指向下一层节点,以此循环直到q指向NULL(个人理解,仅供参考)
附vscode调试代码
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
TreeNode* replaceValueInTree(TreeNode* root) {
struct TreeNode ans;
root->val = 0;
vector<TreeNode*> q = {root};
while(!q.empty()){
vector<TreeNode*> nxt;
int next_sum = 0;
for(auto node: q){
if(node->left){
nxt.push_back(node->left);
next_sum += node->left->val;
}
if(node->right){
nxt.push_back(node->right);
next_sum += node->right->val;
}
}
for(auto node:q){
int children_sum = (node->left?node->left->val:0) + (node->right?node->right->val:0);
if(node->left) node->left->val = next_sum - children_sum;
if(node->right) node->right->val = next_sum - children_sum;
}
q = move(nxt);
}
return root;
}
//创建一个二叉树并返回根节点, nums为层序遍历结果, index为当前节点在nums中的下标,无节点用-1表示
TreeNode* createTree(vector<int>& nums, int index){
if(index >= nums.size() || nums[index] == -1) return nullptr;
TreeNode* root = new TreeNode(nums[index]);
root->left = createTree(nums, 2*index+1);
root->right = createTree(nums, 2*index+2);
return root;
}
//前序遍历
void preOrder(TreeNode* root){
if(root == nullptr) return;
cout << root->val << " ";
preOrder(root->left);
preOrder(root->right);
}
int main()
{
//创建二叉树
vector<int> nums = {5,4,9,1,10,-1,7};
TreeNode* root = createTree(nums, 0);
preOrder(replaceValueInTree(root));
return 0;
}