关于二叉树的四种遍历方法以及递归在二叉树中的运用

**

1:二叉树的遍历(借助队列的先进先出特点来实现)

**

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatBinTree(); /* 实现细节忽略 */
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );

int main()
{
    BinTree BT = CreatBinTree();
    printf("Inorder:");    InorderTraversal(BT);    printf("\n");
    printf("Preorder:");   PreorderTraversal(BT);   printf("\n");
    printf("Postorder:");  PostorderTraversal(BT);  printf("\n");
    printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");
    return 0;
}

/* 你的代码将被嵌在这里 */

先上答案

void InorderTraversal( BinTree BT )
{
    if(BT)
    {
        InorderTraversal(BT->Left);
        printf(" %c",BT->Data);
        InorderTraversal(BT->Right);
    }
}
void PreorderTraversal( BinTree BT )
{
    if(BT)
    {printf(" %c",BT->Data);
        PreorderTraversal(BT->Left);
        PreorderTraversal(BT->Right);
    }
}
void PostorderTraversal( BinTree BT )
    {
    if(BT)
    {
        PostorderTraversal(BT->Left);
        PostorderTraversal(BT->Right);
        printf(" %c",BT->Data);
    }
}

void LevelorderTraversal(BinTree BT)
{
	if (BT == NULL)
	{
		return ;
	}
	int front = -1;
	int rear = -1;
	BinTree *Q = (BinTree *)malloc(sizeof(BinTree)*100); 
	Q[++rear] = BT;//入队 
	while (front != rear)
	{
		BT = Q[++front];//出队 
		printf(" %c",BT->Data);
		if (BT->Left != NULL) Q[++rear] = BT->Left;
		if (BT->Right != NULL) Q[++rear] = BT->Right;
	}

}

前序遍历那几种都十分简单,都是递归,只需要交换代码顺序即可,但层序遍历就需要借助到队列进行实现。因为队列有先进先出的特点,所以我们先将二叉树的根节点放进队列之中,再出队列,如果还有左右子树,将其入队即可,由于先进先出,所以并不影响输出的顺序,如此循环,直到遍历完成即可,即rear==front得时候结束。注意二叉树BT也只是一个指向根节点的指针而已。所以进行出队移动的时候只需要BT = Q[++front];

2.递归在二叉树中的运用

a:求二叉树的高度(注意返回的时候要加上根节点的个数)

int GetHeight( BinTree BT )
{
    if(BT==NULL)
        return 0;
   
    else
    { 
        int m=0,n=0;
        m=GetHeight(BT->Left);
        n=GetHeight(BT->Right);
        if(m>n)
            return m+1;
        else
            return n+1;
    }
}

b:求二叉树的结点个数

int NodeCount( BinTree BT )
{
    if(BT==NULL)
        return 0;
   
    else
return NodeCount(BT->Left)+NodeCount(BT->Right)+1;
}

同样,返回的时候应该是左子树的结点个数+右子树的结点个数+根节点数1.

** c.先序输出叶结点 (15分) 本题要求按照先序遍历的顺序输出给定二叉树的叶结点。**

void PreorderPrintLeaves( BinTree BT )
{
    if(BT==NULL)
        return ; 
    if(BT->Left==NULL&&BT->Right==NULL)
            printf(" %c",BT->Data);
            PreorderPrintLeaves( BT->Left );
            PreorderPrintLeaves( BT->Right );
}

注意这里直接进行左右子树的调用,我开始还写了个判断左或右子树是否为空,这样会导致不满足先序遍历的条件,因为主函数中有为空树的情况,直接退出递归。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值