二叉树练习题

练习题

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;
    }
}

上一篇:AWS ES ISM学习应用笔记


下一篇:【数据结构与算法】之深入解析“不同的二叉搜索树II”的求解思路与算法示例