当前位置:   article > 正文

C++实现二叉树(二叉链表)前序,中序,后序,层序遍历_c++(1)采用二叉链表结构建立二叉树; (2)编程实现二叉树的先序、中序、后序和层序

c++(1)采用二叉链表结构建立二叉树; (2)编程实现二叉树的先序、中序、后序和层序

二叉树的储存结构以及实现

为了建立一棵二叉树,将二叉树中每个结点的空指针引出一个虚结点,将其指定为“#”,以标识其为空,把这样处理后的二叉树称为原二叉树的扩展二叉树。
在这里插入图片描述

设二叉树中的结点均为一个字符,假设扩展二叉树的前序遍历序列有键盘输入,root为指向跟结点的指针,二叉链表的建立过程是:首先输入根节点,若输入的是一个“#”字符,则表明该二叉树为空树,也就是root=NULL;否则输入的字符应该赋给root->data,之后依次递归建立它的左右子树

void creat_tree(treenode*& root)
{
	char ch;
	ch = getchar();
	if ('#' == ch) {
		root = NULL;
	}
	else {
		root = new treenode;
		root->data = ch;
		creat_tree(root->left);       
		creat_tree(root->right);       
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

前、中、后序遍历

前、中、后序遍历实质上都是递归算法的运用,他们之间的区别仅仅是语句执行前后的区别罢了。前序的语句顺序是:输出根节点,访问左子树,访问右子树;中序的语句顺序是:访问左子树,输出根节点,访问右子树;后序的语句顺序是:访问左子树,访问右子树,输出根节点
在这里插入图片描述
如果按前序遍历来输出该二叉树的话,结果为ABDGCEF;若为中序遍历,结果为:DGBAECF;若为后序遍历,结果为:GDBEFCA
代码实现为:

void preOrder(TreeNode* root) {
    if (root == NULL) return;
    cout << root->data;
    preOrder(root->lchild);
    preOrder(root->rchild);
}

void midOrder(TreeNode* root) {
    if (root == NULL) return;
    midOrder(root->lchild);
    cout << root->data;
    midOrder(root->rchild);
}
void backOrder(TreeNode* root) {
    if (root == NULL) return;`
    backOrder(root->lchild);
    backOrder(root->rchild);
    cout << root->data;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

层序遍历

层序遍历更好理解,顾名思义就是一层一层的输出,在这里需要用到队列来实现此操作。依旧是上面的例子,上面那个二叉树一共有四层,第一层为A,第二层为B、C,第三层为D、E、F,第四层为G。所以上面的二叉树层序遍历的结果为ABCDEFG。想要实现层序遍历,首先要判断二叉树的根节点是否为空,如果根节点为空,则直接输出:此二叉树为空!;若不为空,则将二叉树的根节点入队,然后开始队列不为空的判断,在此判断(循环)中:输出此结点,并对他的左右子树进行判断,左右子树不为空则进入队列,为空则直接跳过,最后再将遍历过的结点出队,这样一次判断(循环)便完成了。
代码实现:

void floorOrder(treenode*& root) { 
	deque <Node> c;
	if (root != NULL) {
		c.push_back(root);//根节点入队
	}
	else {
		cout << "此二叉树为空!";
	}
	while (!c.empty()) {//队列不为空判断
		cout << c.front()->data;
		if (c.front()->left != NULL) {//左子树不为空,左子树入队
			c.push_back(c.front()->left);
		}
		if (c.front()->right != NULL) {//右子树不为空,右子树入队
			c.push_back(c.front()->right);
		}
		c.pop_front();//遍历过的结点出队
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

完整测试代码(大佬直接点这里!)

#include<iostream>
#include<stdlib.h> 
#include<deque>  

using namespace std;

typedef struct treenode
{
	char data;
	treenode* right;
	treenode* left;
}*Node;

void creat_tree(treenode*& root)
{
	char ch;
	ch = getchar();
	if ('#' == ch) {
		root = NULL;
	}
	else {
		root = new treenode;
		root->data = ch;
		creat_tree(root->left);       
		creat_tree(root->right);       
	}
}

void preOrder(treenode*& root) {
	if (root == NULL) return;
	cout << root->data;
	preOrder(root->left);
	preOrder(root->right);
}

void midOrder(treenode*& root) {
	if (root == NULL) return;
	midOrder(root->left);
	cout << root->data;
	midOrder(root->right);
}
void backOrder(treenode*& root) {
	if (root == NULL) return;
	backOrder(root->left);
	backOrder(root->right);
	cout << root->data;
}

void floorOrder(treenode*& root) { 
	deque <Node> c;
	if (root != NULL) {
		c.push_back(root);//根节点入队
	}
	else {
		cout << "此二叉树为空!";
	}
	while (!c.empty()) {//队列不为空判断
		cout << c.front()->data;
		if (c.front()->left != NULL) {//左子树不为空,左子树入队
			c.push_back(c.front()->left);
		}
		if (c.front()->right != NULL) {//右子树不为空,右子树入队
			c.push_back(c.front()->right);
		}
		c.pop_front();//遍历过的结点出队
	}
}
int main() {
	treenode* root = NULL;
	cout << "请输入二叉树,空值以#代表:" << endl;
	creat_tree(root);  
	cout << "层序遍历为:";floorOrder(root);cout << endl;
	cout << "前序遍历为:";preOrder(root);cout << endl;
	cout << "中序遍历为:";midOrder(root);cout << endl;
	cout << "后序遍历为:";backOrder(root);cout << endl;
	return 0;
}
//文中测试数据:ABD#G###CE##F##
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78

测试结果如图:
在这里插入图片描述
本文来自大一的蒟蒻,大家多多给出见解,共同学习!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/515114
推荐阅读
相关标签
  

闽ICP备14008679号