已知先序遍历和中序遍历,如何求后续遍历

一般的数据结构都有变量操作,根据需求的不同,二叉树一般有四种遍历方式:

1、先序遍历

如果二叉树为空,遍历结束,否则,第一步,访问根节点;第二步,先序遍历根节点的左子树,第三部,先序遍历根节点的右子树。

2、中序遍历

如果二叉树为空,遍历结束,否则,第一步,中序遍历根节点的左子树;第二步,访问根节点,第三部,中序遍历根节点的右子树。

3、后序遍历

如果二叉树为空,遍历结束,否则,第一步,后序遍历根节点的左子树;第二步,后序遍历根节点的右子树,第三部,访问根节点

4、层次遍历

从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层,则按从左到右的顺序对结点逐个访问。


通过上面的理论可以总结出先序遍历和中序遍历来求解二叉树的过程,步骤如下:

a)确定树的根节点。树根是当前树中所有元素在先序遍历中最先出现的元素,即先序遍历的第一个结点就是二叉树的根。

b)求解树的子树。找到根在中序遍历的位置,位置左边是二叉树的左孩子,位置右边是二叉树的右子树,如果根节点左边或右边为空,那么该方向子树为空;如果根节点左边和右边都为空,那么根节点已经为叶子节点。

c)对二叉树的左、右孩子分别进行步骤a)、b),直到求出二叉树结构为止。

具体实现代码如下:

public class PostOreder__PreAndIN {
	
	public static void main(String[] args) {
		BinaryTree2 biTree=new BinaryTree2();
		int[] pre={1,2,4,8,9,5,10,3,6,7};
		int[] in={8,4,9,2,10,5,1,6,3,7};
		biTree.initTree(pre, in);
		System.out.println("二叉树的后序遍历:");
		biTree.postOrder2();
	}

}
//定义节点的数据结构
class Node2{
	public int data;
	public Node2 left;
	public Node2 right;
	public Node2(int data){
		this.data=data;
		this.left=null;
		this.right=null;
	}
}

//定义一个二叉树
class BinaryTree2{
	private Node2 root;
	public BinaryTree2(){
		root=null;
	}
	//后序遍历方法递归实现
	public void postOrder2(Node2 localRoot){
		if(localRoot!=null){
			postOrder2(localRoot.left);
			postOrder2(localRoot.right);
			System.out.print(localRoot.data+" ");
		}
	}
	public void postOrder2(){
		this.postOrder2(this.root);
	}
	
	//初始化二叉树
	public void initTree(int[] pre,int[] in){
		this.root=this.initTree(pre, 0, pre.length-1, in, 0, in.length-1);
	}
	public Node2 initTree(int[] pre,int start1,int end1,int[] in,int start2,int end2){
		if(start1>end1 ||start2>end2){
			return null;
		}
		int rootData=pre[start1];
		Node2 head=new Node2(rootData);
		//找到根节点所在的位置
		int rootIndex=findIndexInArray(in,rootData,start2,end2);
		int offSet=rootIndex-start2-1;
		//构建左子树
		Node2 left=initTree(pre, start1+1, start1+1+offSet, in, start2, start2+offSet);
		//构建右子树
		Node2 right=initTree(pre, start1+1+offSet+1, end1, in, rootIndex+1, end2);
		head.left=left;
		head.right=right;
		return head;
		
	}
	public int findIndexInArray(int[] a,int x,int begin,int end){
		for(int i=begin;i<=end;i++){
			if(a[i]==x){
				return i;
			}
		}
		return -1;
	}
}
运行结果为:

二叉树的后序遍历:

8 9 4 10 5 2 6 7 3 1 



  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值