已知前序中序重建二叉树的代码实现

本文介绍了一种使用递归方法构建二叉树的算法。通过解析先序遍历和中序遍历数组,确定根节点,再划分左子树和右子树,递归生成完整的二叉树结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
解题思路:首先确立使用递归的思路做题,每次递归构造一个节点。
传入的数组中前序数组pre的第一个元素就是根节点,将这个根节点的值赋给root,然后在中序数组tin中寻找这个元素。这个元素将tin数组分为两半,前半部分是左子树的节点们,后半部分是右子树的节点们
将tin按上述分法分为两个数组,同时pre数组也要照着这个思路分为左右子树两个子数组,然后递归求解,代码如下

public TreeNode reConstructBinaryTree(int[] pre, int[] tin)
    {
        if(pre.Length==0 || tin.Length==0)//若两个数组长度为0,则此时返回空
        {
            return null;
        }
        TreeNode root=new TreeNode(pre[0]);//将先序遍历的第一个节pre[0]点赋给root
        for(int i=0;i<tin.Length;i++)//开始在中序遍历数组中寻找pre[0]的值所在的序号i
        {
            if(tin[i]==pre[0])
            {
                int[] tinLeft=new int[i];//分割包含所有左子树元素的子数组。数组由tin[0]~tin[i-1]组成,大小为i
                int[] preLeft=new int[i]; 
                for(int j=0;j<tinLeft.Length;j++)
                {
                    tinLeft[j]=tin[j];
                    preLeft[j]=pre[j+1];//这里preLeft是除去第一个节点后,往后遍历i个值存入(往后遍历的这些值都是左子树的元素)
                }
                int[] tinRight=new int[tin.Length-i-1];//分割包含所有右子树元素的子数组。数组由tin[i+1]~tin[tin.Length-1]组成,大小为tin.Length-i-1
                int[] preRight=new int[tin.Length-i-1];
                for(int j=0;j<tinRight.Length;j++)
                {
                    tinRight[j]=tin[i+1+j];
                    preRight[j]=pre[j+i+1];
                }
                root.left=reConstructBinaryTree(preLeft, tinLeft);//递归生成左右子树
                root.right=reConstructBinaryTree(preRight,tinRight);
                break;//一次递归中只需要找到一次
            }
        }
        return root;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值