广度优先搜索 / 深度优先搜索
题目一
- 图像渲染
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点
解题思路
首先我们得要了解什么是树,二叉树。看给的例子思路可能会出现一个错误,就是二叉树的子树为空时,我们该如何去想办法添加进去。其实在创建树的时候,根据自定义的树的结构来判断,子树的结点为空时,是否占有一个空间。当占据占据空间时,说明值为null或者是0。这样就比较好解。若没有空间,则需要赋予内存并且赋值为0。leetcode给的树结构是自定义的。默认是赋予空间的标准树结构。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if (root1==null&&root2==null) {
return null;
}else if (root1==null) {
return root2;
} else if(root2==null){
return root1;
}
TreeNode root=new TreeNode(root1.val+root2.val);
root.left=mergeTrees(root1.left, root2.left);
root.right=mergeTrees(root1.right, root2.right);
return root;
}
}
题目二
- 填充每个节点的下一个右侧节点指针
给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
解题思路
因为是完全二叉树,每个结点都是存在值的。我们通过规律可以发现,只有在每个层次的最右边,才会出现指针为null的情况。所以我们首先需要判断树的大小以此来获取层数。每当走到最右边的时候,赋值next为#即可。这个时候我们可以将树的结构转换成队列的形式,利用先进先出的特点来解决问题。当队列poll到最后一个的时候,就是最右边结点。当然也可以用栈,那就是当push到最后一个的时候,为最右边。
class Solution {//通过层数结点所在位置来判断
public Node connect(Node root) {
if (null == root) {
return root;
}
Queue<Node> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int size=queue.size();
for (int i = 0; i < size; i++) {
Node cur=queue.poll();
if(i<size-1){
cur.next=queue.peek();
}
if(cur.left!=null)queue.add(cur.left);
if(cur.right!=null)queue.add(cur.right);
}
}
return root;
}
}
进阶思路
利用递归,来解决。
//定义:链接接root树 左右两节点
public Node connect(Node root) {
connectAB(root.left,root.right);
return root;
}
//定义:链接la,lb 两树节点
public void connectAB(Node la, Node lb) {
if (la == null || lb == null) {
return ;
}
//链接左节点树
connectAB(la.left, la.right);
//链接右节点树
connectAB(lb.left, lb.right);
//链接左树右节点 和右树子节点
connectAB(la.right, lb.left);
//链接当前节点
la.next=lb;
}