栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

6-9 二叉树的遍历

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

6-9 二叉树的遍历

本题要求给定二叉树的4种遍历。

函数接口定义:
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );

其中BinTree结构定义如下:

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

要求4个函数分别按照访问顺序打印出结点的内容,格式为一个空格跟着一个字符。

裁判测试程序样例:
#include 
#include 

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;
}

输出样例(对于图中给出的树):

Inorder: D B E F A G H C I
Preorder: A B D F E C G H I
Postorder: D E F B H G I C A
Levelorder: A B C D F G I E H

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

 (1)中序遍历:指针 BT指向下一个待访问的左节点。如果左节点非空,则继续访问下一个待访问的左节点,直到访问BT为空。如果 BT 为空,说明此时左子树已经访问到尽头了,输出当前栈顶元素。继续访问当前栈顶的右子树,并把 BT设置成栈顶的右子树的左子树,即下一个待访问的节点。

(2)先序遍历:输出当前栈顶元素。指针 BT指向下一个待访问的左节点。如果左节点非空,则输出当前左节点元素,继续访问当前节点的左子树。如果 BT 为空,说明此时左子树已经访问到尽头了,继续访问当前栈顶的右子树。

(3)后序遍历:指针 BT指向下一个待访问的左节点。如果左节点非空,则继续访问下一个待访问的左节点,直到访问左子树为空。继续访问当前节点的右子树。直到访问右子树为空时,则可输出当前栈顶。

(4)层次遍历:用一个队列保存被访问的当前节点的左右孩子。首先将根节点指针入队列,然后从队头取出一个元素,每取一个元素,执行下面两个操作:

  1. 访问该元素所指向的节点
  2. 若该元素所指节点的左右孩子节点非空,则将该元素所指节点的左孩子指针和右孩子指针顺序入队。此过程不断进行,当队列为空时,二叉树的层次遍历结束
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) {  //层次遍历
	BinTree S[100],B;
	int front=0, rear=0;
	if(!BT) return;
	else{
		S[rear++] = BT;
		while (front != rear){
			B=S[front++];
			printf(" %c", B->Data);
			if(B->Left)	S[rear++] = B->Left;
			if(B->Right) S[rear++] = B->Right;	
		}
	}
}

层次遍历参考:层次遍历(会了它,我能一打十) - 知乎 (zhihu.com)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/870082.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号