Leetcode 2641. 二叉树的堂兄弟节点 II

Leetcode 2641. 二叉树的堂兄弟节点 II_第1张图片
本题为修改给定二叉树中结点的值,修改的规则为:将原来的值替换为该结点所有堂兄弟结点值的和。

其实我们可以延申一下题意,怎样去计算该结点所有堂兄弟结点值的和?其实只需要先计算每一层所有结点的和,再减掉其本身的值和兄弟结点(如有)的值。
那么又怎样去计算每一层的结点值之和?可以通过层序遍历来收集每一层中所有结点,并计算求和。
在层序遍历中,需要先创建一个队列,并将结点添加至队列中;接下来,若队列不为空,则遍历每一层即深度相同的节点,并将对应的val相加得到和sum,最后的结点值就是sum减去本结点值及其亲兄弟结点值啦!

实现代码如下:

class Solution {
    public TreeNode replaceValueInTree(TreeNode root) {
    	//若当前遍历节点无堂兄弟节点,则其值为0
    	root.val=0;
    	Queue<TreeNode> queue = new ArrayDeque<>();
    	//根节点入队
    	queue.add(root);
    	while(!queue.isEmpty()) {
    		int sum=0;
    		int size=queue.size();
    		//遍历每一层即深度相同的节点,并将对应的val相加得sum
    		//最后的结点值就是sum减去本结点值及其亲兄弟结点值
    		for(TreeNode node:queue) {
    			if(node.left!=null) {
    				sum+=node.left.val;
    			}
    			if(node.right!=null) {
    				sum+=node.right.val;
    			}
    		}
    		//第二遍遍历:将不算堂兄弟的val减去
    		while(size-->0) {
    			TreeNode node = queue.poll();
    			//记录父节点的所有儿子结点val之和
    			int sumofxy= (node.left == null ? 0 : node.left.val) + 
    					(node.right == null ? 0: node.right.val);
    			//若该父节点node存在左右儿子则更改val后将儿子入队
    			if(node.left!=null) {
    				node.left.val=sum-sumofxy;
    				queue.add(node.left);
    			}
    			if(node.right!=null) {
    				node.right.val=sum-sumofxy;
    				queue.add(node.right);
    			}
    		}
    		
    		
    	}
    	return root;
    }
}

你可能感兴趣的:(leetcode,算法,职场和发展)