练习题
1合并二叉树
1.合并二叉树
代码:
package bin_tree.leetcode;
import java.util.LinkedList;
//合并两个二叉树
public class Num617 {
/**
* 617. 合并二叉树
*
* @param root1
* @param root2
* @return
*/
public TreeNode mergeTrees2(TreeNode root1, TreeNode root2) {
if (root1 == null) {
return root2;
}
if (root2 == null) {
return root1;
}
LinkedList<TreeNode> linkedList = new LinkedList<>();
linkedList.add(root1);
linkedList.add(root2);
while (!linkedList.isEmpty()) {
TreeNode n1 = linkedList.poll();
TreeNode n2 = linkedList.poll();
n1.val = n1.val + n2.val;
if (n1.left != null && n2.left != null) {
linkedList.add(n1.left);
linkedList.add(n2.left);
} else if (n1.left == null) {
n1.left = n2.left;
}
if (n1.right != null && n2.right != null) {
linkedList.add(n1.right);
linkedList.add(n2.right);
} else if (n1.right == null) {
n1.right = n2.right;
}
}
return root1;
}
}
运行截图:
2.递增顺序搜索树
2.递增顺序搜索树
代码:
package bin_tree.leetcode;
import java.util.ArrayList;
import java.util.List;
public class Num897 {
public TreeNode increasingBST(TreeNode root) {
List<Integer> mark = new ArrayList<Integer>();
dfs(root,mark);
TreeNode res = new TreeNode(-1);
TreeNode cur = res;
for(int value : mark){
cur.right = new TreeNode(value);
cur = cur.right;
}
return res.right;
}
public void dfs(TreeNode root,List<Integer> mark){
if(root==null)
return ;
dfs(root.left,mark);
mark.add(root.val);
dfs(root.right,mark);
}
}
运行截图:
3.二叉树的完全性检验
3.二叉树的完全性检验
运行截图:
4.二叉树的最大宽度
4.二叉树的最大宽度
代码:
package bin_tree.leetcode;
import java.util.LinkedList;
import java.util.Queue;
public class Num662 {
public int widthOfBinaryTree(TreeNode root) {
// 1.创建队列,进行层次遍历
Queue<newNode> que = new LinkedList();
// 2.根节点入队。深度0,位置0
que.add(new newNode(root,0,0));
// 3. 定义当前的深度,当前层最左侧的位置,当前最大宽度
int curDeep = 0, left=0, res=0;
// 4. 层次遍历
while(!que.isEmpty()){
// 4.1 出队节点a
newNode a = que.poll();
// 4.2 若出队节点非空,将其左右孩子入队
if(a.node != null){
que.add(new newNode(a.node.left, a.deep+1, a.pos*2)); //左孩子
que.add(new newNode(a.node.right, a.deep+1, a.pos*2+1)); //右孩子
// 4.3 判断是否遍历到下一层,更新最左侧的下标(只有遍历到下一层的第一个节点时,才会更新left)
if(curDeep != a.deep){
left = a.pos;
curDeep = a.deep;
}
// 4.4 计算当前层:从left到出队节点a 的宽度
res = Math.max(res, a.pos - left + 1);
}
}
return res;
}
}
class newNode{
TreeNode node; //当前的结点
int deep,pos; //当前节点的深度和位置(从下标0开始)
newNode(TreeNode n, int d, int p){
node = n;
deep = d;
pos = p;
}
}
运行截图:
5.二叉树搜索树与双向链表
5.二叉搜索树与双向链表
代码:
package bin_tree.leetcode;
import java.util.Stack;
public class NumOffer36 {
public TreeNode ConvertWithStack(TreeNode pRootOfTree) {
if(pRootOfTree==null)
return null;
//如果根节点为 null 返回 null 否则当前节点 cur 指向根节点 pRootOfTree
TreeNode cur=pRootOfTree;
TreeNode pre=null;
//pre 用于指向当前节点的前一个节点,开始时为 null。
Stack<TreeNode> stack=new Stack<TreeNode>();
while(!stack.isEmpty()||cur!=null)
{
//将左子树上的节点入栈
while(cur!=null)
{
stack.push(cur);
cur=cur.left;
}
//如果已经到了树的最左边,则将栈中的节点出栈。
cur=stack.pop();
if(pre==null)
{
//刚开始的时候 pre==null 将最左边的 节点赋值给 pRootOfTree。当前节点复值给pre
pRootOfTree=cur;
pre=cur;
}
else {
pre.right=cur;
cur.left=pre;
pre=cur;
//前一个节点的右指针指向 cur 当前节点,当前节点的左指针指向 前一个节点pre
}
cur=cur.right;
}
return pRootOfTree;
}
}