二叉树的相关基本概念:
在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
一棵深度为k,且有2^k-1个结点的二叉树,称为满二叉树。这种树的特点是每一层上的结点数都是最大结点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且或者最后一层是满的,或者是在右边缺少连续若干结点,则此二叉树为完全二叉树。具有n个结点的完全二叉树的深度为floor(log2n)+1。深度为k的完全二叉树,至少有2k-1个叶子结点,至多有2k-1个结点。
来自搜狗词条:https://baike.sogou.com/v111776.htm?fromTitle=%E4%BA%8C%E5%8F%89%E6%A0%91
输入:
ABD#G###CE##F##
预期输出:
经前序遍历后的结果为:A B D G C E F
经中序遍历后的结果为:D G B A E C F
经后序遍历后的结果为:G D B E F C A
源码:
#include <iostream>
using namespace std;
//结点类型
class BiNode{
public :
//数据域
char data;
//左右孩子指针
BiNode *left_Child;
BiNode *right_Child;
};
//二叉树类
class BiTree{
//用根结点表示一棵二叉树
public:
BiNode *root;
//构造函数
BiTree::BiTree(){
root = createTree(root);
}
//创建树
BiNode* createTree(BiNode *bt);
//前序遍历树
void preOrderTraverse(BiNode *bt);
//中序遍历树
void inOrderTraverse(BiNode *bt);
//后序遍历树
void postOrderTraverse(BiNode* bt);
//层次遍历树
void leverOrderTravrse(BiNode* bt);
};
//建树
BiNode* BiTree::createTree(BiNode *bt){
char ch;
cin >> ch;
if (ch == '#')
bt = NULL;
else{
bt = new BiNode;
bt->data = ch;
bt->left_Child = createTree(bt->left_Child);
bt->right_Child = createTree(bt->right_Child);
}
return bt;
}
//前序遍历
void BiTree::preOrderTraverse(BiNode* bt){
if (bt)
{
cout << bt->data <<" ";
preOrderTraverse(bt->left_Child);
preOrderTraverse(bt->right_Child);
}else{
return;
}
}
//中序遍历
void BiTree::inOrderTraverse(BiNode* bt){
if (bt){
inOrderTraverse(bt->left_Child);
cout << bt->data << " ";
inOrderTraverse(bt->right_Child);
}
else{
return;
}
}
//后序遍历
void BiTree::postOrderTraverse(BiNode* bt){
if (bt){
postOrderTraverse(bt->left_Child);
postOrderTraverse(bt->right_Child);
cout << bt->data << " ";
}
else{
return;
}
}
//主函数
int main(){
//创建一棵树
BiTree *tree = new BiTree();
cout << "经前序遍历后的结果为:";
tree->preOrderTraverse(tree->root);
cout << "\n";
cout << "经中序遍历后的结果为:";
tree->inOrderTraverse(tree->root);
cout << "\n";
cout << "经后序遍历后的结果为:";
tree->postOrderTraverse(tree->root);
cout << "\n";
return 0;
}
运行结果: