数据结构基础—二叉树的非递归遍历和基本操作
数据结构基础—二叉树的非递归遍历和基本操作
非递归遍历
先序
//非递归先序遍历二叉树
void zhongxu(BiTree T){
BiTree stack[MAX];//模拟栈
BiTree node;
int top = 0;
if(T == NULL){
printf("树为空树!\n");
return;
}else{
stack[++top] = T;
while(node != NULL || top > 0){//树不空或是栈不空
node = [top--];
printf("%c", node->data;
if(node->rchild != NULL) stack[++top] = node->rchild;
if(node->lchild != NULL) stack[++top] = node->lchild;
}
}
}
中序
//非递归中序遍历二叉树
void zhongxu(BiTree T){
BiTree stack[MAX];//模拟栈
BiTree node;
int top = 0;
if(T == NULL){
printf("树为空树!\n");
return;
}
node = T;
while(node != NULL || top > 0){//树不空或是栈不空
//将所有的左子树节点入栈
while (node != NULL) {
stack[++top] = node;//没有将top下至一个单位
node = node->lchild;
}
node = stack[top];//此时指针指向节点的左孩子为空节点(一定没有),访问节点
top--;//退栈
printf("%c", node->data);
//指针指向右孩子
node = node->rchild;
}
}
后序
//非递归后序
void houxu(BiTree T){
BiTree p = T;
BiTree stack[MAX];
BiTree r = NULL;//辅助指针,记录被访问过的节点
int top = 0;
while (p || top >= 1){//树不空或是栈不空
while (p) {//左子全部进栈
stack[++top] = p;
p = p->lchild;
}
p = stack[top]; //指针指向最后一个入栈的左节点
if (NULL== p->rchild || p->rchild == r) {//此节点没有右孩子或者右孩子已经访问过=>访问它
printf("%c", p->data);//访问该节点值
top--;//退栈
r = p; //记录最近访问过的节点
p = NULL; //节点访问完后重置p指针,p要重新指向退栈后的栈顶
}
else {
p = p->rchild; //右孩子存在则指向右孩子,重复上面操作
}
}
}
基本操作
先序创建二叉树
/* 先序遍历创建二叉树*/
void createBiTree(BiTree *t){
char s;
BiTree q;
cout << "请输入二叉树(先序,#为空):";
s=getche();
cout << endl;
if(s=='#'){
*t=NULL;
return;}
q = new BtNode;
if(q == NULL) exit(0);
q->data=s;
*t=q;
createBiTree(&q->lchild); /*递归建立左子树*/
createBiTree(&q->rchild); /*递归建立右子树*/
}
后序销毁二叉树
void DeleteBiTree(BiTree T){
if(T){
DeleteBiTree(T->lchild);
DeleteBiTree(T->rchild);
free(T);
}
}
void DestroyBiTree(BiTree T){
DeleteBiTree(BiTree T);
T = NULL;
}
算结点数
空数为零;否则左+右+1
//求结点
int qiujiedian(BiTree p){
if(p == NULL) return 0;
else return (qiujiedian(p->lchild)+qiujiedian(p->rchild)+1);
}
算深度
空树为零;否则max(左深,右深)+1
//算深度(max子树+1)
int qiushendu(BiTree T){
if(T == NULL) return 0;
if(T->left == 0&&T->right == 0) return 1;//T不是下一个结点就是当前结点所以...
return(max(qiushendu(T->lchild),qiushendu(T->rchild))+1);
}