二叉树的前序、中序、后序遍历以及根据前序和中序或中序和后序生成二叉树

二叉树的前序、中序、后序遍历;根据前序和中序或中序和后序生成二叉树

给定如下二叉树:
前序遍历结果:1234567
中序遍历结果:3241657
后序遍历结果:3426751
在这里插入图片描述
遍历代码实现:思路:将子节点以及其下节点看做一个树,相当于递归获取树的每个节点

    //前序遍历: 根、左节点、右节点,
    public static void preIterate(TreeNode root){
		if(root==null) return;
		System.out.print(root.val+" ");
		preIterate(root.left);
		preIterate(root.right);
	}
    //中序遍历: 左节点、根、右节点
	public static void midIterate(TreeNode root){
		if(root==null) return;
		midIterate(root.left);
		System.out.print(root.val+" ");
		midIterate(root.right);
	}
    //后序遍历: 左节点、右节点、根	
	public static void sufIterate(TreeNode root){
		if(root==null) return;
		sufIterate(root.left);
		sufIterate(root.right);
		System.out.print(root.val+" ");
	}
    ```

根据前序和中序或中序和后序生成二叉树:
思路:中序是根据根节点分成两边,左子树在根节点的左边,右子树节点在根的右边。
①对于前序和中序:前序是先打印根节点,对于前序数据正序处理。
②对于中序和后序:后序遍历根节点在最后,对于后序数组倒序处理。
对于分开的两端同样符合上述说明,所以迭代处理即可,主要在于计算好分开两端的区间。

//根据前序和中序生成二叉树:
	public static TreeNode reConstructBinaryTreeThroughMidAndSuf(int[] in,int[] suf){
		TreeNode root = null;
        
        if(suf.length != in.length){
            return null;
        }
		root = treeBuildSuf(suf, 0, suf.length-1, in, 0, in.length-1);
		return root;
	}
    private static TreeNode treeBuild(int[] pre,int preStart, int preEnd, int [] in, int inStart, int inEnd){
	    	if(preStart>preEnd || inStart>inEnd) return null;
	    	TreeNode head = new TreeNode(pre[preStart]);
	    	int rootLoc = findLoc(in,pre[preStart],inStart,inEnd);
	    	int step = rootLoc-inStart;
	    	head.left = treeBuild(pre, preStart+1, preStart+step, in, inStart, rootLoc-1);
	    	head.right = treeBuild(pre, preStart+step+1, preEnd, in, rootLoc+1, inEnd);
	        return head;
	 }
      //根据中序和后序生成二叉树:
	  public static TreeNode reConstructBinaryTreeThroughPreAndMid(int [] pre,int [] in) {
	        TreeNode root = null;
	        if(pre.length != in.length){
	            return null;
	        }
	        root = treeBuild(pre, 0, pre.length-1, in, 0, in.length-1);
	        return root;
	    }
	    
      private static TreeNode treeBuildSuf(int[] suf,int sufStart, int sufEnd, int [] in, int inStart, int inEnd){
	    	if(sufStart>sufEnd || inStart>inEnd) return null;
	    	TreeNode head = new TreeNode(suf[sufEnd]);
	    	int rootLoc = findLoc(in,suf[sufEnd],inStart,inEnd);
	    	head.left = treeBuildSuf(suf, sufStart, sufStart + rootLoc - inStart -1 , in, inStart, rootLoc-1);
	    	head.right = treeBuildSuf(suf, sufStart+rootLoc-inStart, sufEnd-1, in, rootLoc+1, inEnd);
	        return head;
	    }
	    
	    public static int findLoc( int [] in , int value, int start, int end){
	    	for(int i = start; i<= end; i++){
	    		if(in[i]==value){
	    			return i; 
	    		}
	    	}
	    	return -1;
	    }

有问题欢迎在评论区一起讨论,一起学习!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值