数据结构基础—二叉树的非递归遍历和基本操作

数据结构基础—二叉树的非递归遍历和基本操作

非递归遍历

先序

//非递归先序遍历二叉树
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);
}
posted @ 2022-11-18 10:59  T,a,o  阅读(62)  评论(0编辑  收藏  举报