数据结构03-二叉树

概念

二叉树由一个根节点及两个不相交的左子树和右子树组成;

二叉树可以是空集合,可以是空左子树或空右子树,或者左右子树都是空,也可以左右子树都不为空;

二叉树一般用链表指针实现;

 

遍历

二叉树的遍历方式:

1.深度优先遍历二叉树,利用递归实现

void DeepOrder(Tree tree)
{
       if(tree!=null){
               visit(tree.root);//访问根节点 前序遍历
               DeepOrder(tree.left);//访问左节点
               DeepOrder(tree.right);//访问右节点
        }      
}

2.非递归深度优先遍历二叉树

void DeepOrder(Tree tree)
{
   Tree tmp=tree.root; //非递归深度优先前序遍历
   Stack.init;
   while(!Stack.isEmpty() || tmp){
		if(!tmp){
			visit(tmp);
			Stack.push(tmp);
			tmp=tmp.leftTree;	
		}else{
			tmp=Stack.top();
			Stack.pop;
			tmp=tmp.rightTree;
		}
   } 
}    

从根结点开始,每遇到一个结点,就访问该结点,并把此结点入栈,然后访问结点的左子树;
访问完左子树后,从栈顶不断pop结点,并遍历结点的右子树;


void DeepOrder(Tree tree)
{
   Tree tmp=tree.root; //非递归深度优先中序遍历
   Stack.init;
   while(!Stack.isEmpty() || tmp){
		if(!tmp){
			Stack.push(tmp);
			tmp=tmp.leftTree;	
		}else{
			tmp=Stack.top();
			visit(tmp);
			Stack.pop;
			tmp=tmp.rightTree;
		}
   } 
}

从根结点开始,每遇到一个结点,把此结点入栈,然后访问结点的左子树;
访问完左子树后,访问栈顶结点,从栈顶不断pop结点,并访问结点的右子树;

  

3.广度优先遍历二叉树

 

深度优先遍历

深度遍历二叉树时,根据根节点的遍历顺序,可以分成下面3种遍历:

前序遍历二叉树:1.先访问根节点 2.访问左节点 3.访问右节点

中序遍历二叉树:1.先访问左节点 2.访问根节点 3.访问右节点

后序遍历二叉树:1.先访问左节点 2.访问右节点 3.访问根节点

以下二叉树

前序遍历:ABDCEGFHI

中序遍历:DBAEGCHFI

后序遍历:DBGEHIFCA

可以根据二叉树的遍历结果倒推出二叉树的结构;

 

posted @ 2017-09-23 23:53  zxuan  阅读(177)  评论(0)    收藏  举报