递归和非递归方法先序遍历二叉树

题目描述

用先序递归的方式构建二叉树
 

递归和非递归方法先序遍历二叉树_第1张图片

输入

输入一行,按照先序输入一棵二叉树,其中空节点用 -1 表示。

输出

先序遍历二叉树的序列。

样例输入

4 1 0 -1 -1 2 -1 3 -1 -1 6 5 -1 -1 7 -1 8 -1 -1

样例输出

4 1 0 2 3 6 5 7 8

 代码

#include
using namespace std;
//二叉树的两种存储方式定义如下 
/*typedef struct SqTree{//顺序存储的二叉树定义 
	int data;
	bool isEmpty;
}SqTree[100];//相当于定义了一个长度为100的结构体类型的数组 */

typedef struct BiTNode{//二叉链表存储二叉树定义 
	int data;
	struct BiTNode *lchild,*rchild;
	BiTNode(int data):data(data),lchild(NULL),rchild(NULL){};//列表初始化 
}BiTNode,*BiTree; 

BiTree CreateBiTree(){//先序递归构建二叉树 
	int val;
	scanf("%d",&val);  
	if(val == -1){//若输入的值为-1,则说明该节点为空结点(例如:输入 8 -1 -1,说明8结点的左右子树均为空) 
		return NULL;
	}
	BiTNode *T = new BiTNode(val);//由于结构体内定义了列表初始化,因此左右孩子指针自动赋值为空
	T->lchild = CreateBiTree();
	T->rchild = CreateBiTree();
	return T;
} 
/*void PreOrder(BiTree T){//先序递归遍历二叉树
	if(T == NULL){//二叉树类型题目,无论如何都要首先判断树是否为空 
		return;
	}
	printf("%d ",T->data);//打印树的结点的值 
	PreOrder(T->lchild);//先序递归遍历左子树 
	PreOrder(T->rchild);//先序递归遍历右子树 
	return; 
}*/
void PreOrder(BiTree T){//先序非递归遍历二叉树 
//一定要考虑传入树T判空的情况
//	if(T==NULL)  return;这句话在这里可加可不加,因为在此题中若传入的树为空,即p为空,不会进入while循环,所以什么也不会做 
	stackst;//需要用一个栈来存储父结点的信息
	BiTNode *p=T;//遍历指针,初始从根节点开始遍历 
	while(p!=NULL||st.empty()==false){//若p不为空或者栈不为空进入while循环 
		if(p!=NULL){
			printf("%d ",p->data);
			st.push(p);//p不为空,则压入栈
			p=p->lchild; 
		}
		else{//若p为空(证明遍历到空指针了,左子树全部访问完毕),取出栈顶元素,返回当前结点的父节点并遍历父结点的右子树
			p = st.top();
			st.pop();//栈顶元素出栈 
			p=p->rchild;
		} 
	}
	 
}
int main(void){
	BiTNode *T = CreateBiTree();
	PreOrder(T);
	return 0;
}

你可能感兴趣的:(树和二叉树,数据结构)