二叉树的性质以及二叉树的遍历(非递归)(c语言)(一)
二叉树的性质以及二叉树的遍历(非递归)(c语言)(一)
奔跑的码农 发表于2年前
二叉树的性质以及二叉树的遍历(非递归)(c语言)(一)
  • 发表于 2年前
  • 阅读 188
  • 收藏 6
  • 点赞 2
  • 评论 0
摘要: 二叉树(Binary Tree)是一种树形结构,她的特点是每个结点至多有两颗子树,并且二叉树的子树有左右之分。在二叉树的一些应用中,常常需要在树中查找某种特征的结点,或者对树中全部结点逐一进行某种处理。这就提出了一个遍历二叉树(traversing binary tree)的问题。

二叉树的性质:

性质 1 在二叉树的第i层上至多有2^(i-1)个结点(i>=1)。

性质 2 深度为k的二叉树至多有2^k-1个结点,(k>=1)。

性质 3 任何一颗二叉树,终端结点为n0,度为2的结点为n2,那么n0=n2+1。

性质 4  具有n个结点的完全二叉树的深度为└㏒2 n┘+1。

性质 5 完全二叉树按层次从上到下从左到右依次编号。编号为n的节点的左孩子为2n。

二叉树的储存结构

lchild data rchild
/*---------二叉树的二叉链表储存表示----------*/
typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode ,*BiTree;

非递归遍历需要栈:栈的实现过程:栈的线性储存结构与链式储存结构的实现(C语言)

栈部分的内容:

typedef BiTree pElemType;
typedef struct Snode //栈的储存结构 
{
    pElemType data;	//数据域 

    struct Snode *next; //指针域 
}Snode,*LinkStack;
void Init_StackL(LinkStack *S)	//初始化院栈 
{
    *S=NULL;
}
Status Push_L(LinkStack *S,pElemType x) 	//压栈 
{
    LinkStack p;
    p=(LinkStack)malloc(sizeof(Snode)); 
    p->data=x;

    p->next=*S;

    *S=p;
    return 1;
}
Status Pop_L(LinkStack *S,pElemType *temp_) //出栈 
{
    LinkStack p;
    pElemType temp;
    if(*S==NULL) return 0;

    temp=(*S)->data;

    p=*S;

    *S=p->next;
    free(p);

    *temp_=temp;
    return 1;
}
Status StackEmpty(LinkStack *S) 	//判断栈顶是否为空 如果为空返回 0 
{
    if(*S==NULL) return 0;

    else
        return 1;
}

以下为二叉树部分:

Status CreateBiTree(BiTNode **T)	//先序生成二叉树 
{
    int ch;

    scanf("%d",&ch);
    if(ch==0) *T=NULL;
    else{
        if(!(*T=(BiTNode *)malloc(sizeof(BiTNode))))exit(0);
        (*T)->data=ch;
        CreateBiTree(&(*T)->lchild);
    
        CreateBiTree(&(*T)->rchild);
    }
    return 1;
}
}
Status preOrderTraverse(BiTNode *T)//前序遍历二叉树,并统计总结点 
{
	int i=0;
    LinkStack S;
    BiTNode *p;
    p=T;
    Init_StackL(&S);
    while(p||StackEmpty(&S)){//StackEmpty(&S)判断栈顶是否为空 如果为空返回 0 
        if(p){
            Push_L(&S,p);
      		     printf("%d\t",p->data);
      		     i++;
            p=p->lchild; 

        }
        else{
            Pop_L(&S,&p);
 
            if(!(p->data)) return 0;
       
            p=p->rchild;
        }
    }
  //  return 1;
	printf("\n所有生成节点的总数为:%d\n",i);//总结点	
} 
Status InOrderTraverse(BiTNode *T)	//中序遍历二叉树 
{

    LinkStack S;
    BiTNode *p;
    p=T;
    Init_StackL(&S);
    while(p||StackEmpty(&S)){//StackEmpty(&S)判断栈顶是否为空 如果为空返回 0 
        if(p){
            Push_L(&S,p);
      
            p=p->lchild; 

        }
        else{
            Pop_L(&S,&p);
 
            if(!(p->data)) return 0;
            printf("%d\t",p->data);
            p=p->rchild;
        }
    }
    return 1;
}
void postorder(BiTNode *T)//用递归的方法后续遍历二叉树 
{
	if(T!=NULL)
	{
		postorder(T->lchild);
		postorder(T->rchild);
		printf("%d\t",T->data);
	}
}

以下为测试函数,先序生成二叉树:如果为结点空则输入 0。

我们输入的数据为:1 2 4 0 0 5 0 0 3 0 0 ;

void main()
{
    BiTNode *T;
        printf("请按如下图案先序生成链表,0代表为空:\n");
	printf("        ①\n");
	printf("      ╱   ╲\n");
	printf("    ②       ③ \n");
	printf("  ╱   ╲\n");
	printf("④       ⑤ \n");
	printf("输入的数字是1 2 4 0 0 5 0 0 3 0 0 "); 
    CreateBiTree(&T);
   	printf("        ①\n");
	printf("      ╱   ╲\n");
	printf("    ②       ③ \n");
	printf("  ╱   ╲\n");
	printf("④       ⑤ \n");
   	printf("中序遍历二叉树的结果为:");
    InOrderTraverse(T);
	printf("\n后续遍历二叉树的结果为:");
    postorder(T);//用递归的方法后续遍历二叉树 
   	printf("\n前序遍历二叉树的结果为: ");
   	preOrderTraverse(T);
   	printf("\n");
}

程序运行的结果为:

正在加载图片


学习数据结构记录,如有错误欢迎指正。

参考书:数据结构 c语言版

共有 人打赏支持
粉丝 11
博文 23
码字总数 28190
×
奔跑的码农
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: