编程题——二叉树

题目:

1. 已知前序和中序,重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
2. 判断二叉树B是不是A的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
3、源二叉树的镜像(前序,有孩子节点就交换)
操作给定的二叉树,将其变换为源二叉树的镜像。
4、按层打印二叉树(队列)
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
5、判断数组是不是某二叉搜索树的后序遍历的结果(判断左右子树和根节点大小关系)
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
6、打印出二叉树中结点值的和为输入整数的所有路径(前序遍历,ArrayList存放路径,和路径集合)
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)

————————————————————————————————————————————————

代码如下:
1. 已知前序和中序,重建二叉树
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution 
{
    public TreeNode reConstructBinaryTree(int [] pre,int [] in)
    {
        TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,
                                             in,0,in.length-1);
        return root;
    }

    private TreeNode reConstructBinaryTree(int[]pre,int preL,int preR,
                                           int[]in,int InL,int InR)
    {
        if(preL>preR||InL>InR)
            return null;

        //从前序遍历序列  找到要构建的二叉树的根节点root
        TreeNode root=new TreeNode(pre[preL]);//构建二叉树,根节点初始化为 前序遍历第一个节点
        int leftTreeSize=0;//定义前序遍历根节点 在中序遍历中 位置 左边的左子树的长度

        //遍历中序数组
        for (int i = InL; i <=InR ; i++)
        {
            if(in[i]==pre[preL])//一直遍历中序数组,直到找到与前序数组中的根节点相等的节点,此时根节点在中序数组中下标为i
            {
                leftTreeSize=i-InL;//找到与前序遍历对应的根节点所在的 下标i 时,在中序遍历数组中根节点左边左子树的长度

                //第一次找到二叉树左子树 ,pre :[preL,[preL+1,,,,preL+leftTreeSize],[preL+leftTreeSize+1,,,,preR]]对应 根左右
                //左子树在  前序遍历和中序遍历的 对应区间
                root.left=reConstructBinaryTree(pre,preL+1,preL+leftTreeSize,
                                                in,InL,i-1);
                //第一次找到二叉树右子树,In,[[InL,,,i-1],i(根节点所在下标),[i+1,inR]]对应 左根右
                //右子树在 前序遍历  和  中序遍历的 对应区间 
                root.right=reConstructBinaryTree(pre,preL+leftTreeSize+1,preR,
                                                 in,i+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值