二叉树总结
树的概念(递归定义):树是一些节点的集合,这个集合可以为空,若非空,则它由一个根节点r和0个或多个非空的(子)树组成,这些子树中每一棵的根都被来自根 r 的一条有向的边所连接。
树叶(leaf):没有儿子的节点;
兄弟(sibling):具有相同父亲的节点;类似还有祖父和孙子节点。
路径:从节点n1到nk的路径定义为节点n1,n2,n3,...,nk的一个序列,使得对于 1 <= i < k 节点ni是ni+1的父亲;路径的长为路径上边的数量,即K-1。
深度(depth):某节点的深度为树根到该节点的唯一路径的长度。根节点的深度为0
高度(height):节点 ni 的高度为 ni 到一片树叶的最长路径的长。树叶的高度都是0
树的高度:一棵树的高等于它的根的高。
树的深度:一棵树的深度等于它的最深的树叶的深度。
树的深度总是等于这棵树的高度
二叉树:二叉树是一种特殊的树,其中每个节点都不能有多于两个的儿子。
二叉树的定义(递归定义):二叉树是一些节点的集合,要么为空;要么有一个根节点和两棵子二叉树构成。(子树也是二叉树,也可以为空)
#include <iostream>
using namespace std;
typedef struct BTNode {
char val;
struct BTNode *left, *right;
BTNode(char x) :
val(x), left(nullptr), right(nullptr) {
}
}BTNode, *BTree;
//创建一棵二叉树
BTree createTree() {
BTree pA = new BTNode('A');
BTree pB = new BTNode('B');
BTree pC = new BTNode('C');
BTree pD = new BTNode('D');
BTree pE = new BTNode('E');
BTree pF = new BTNode('F');
pA->left = pC;
pA->right = pB;
pC->left = pD;
pC->right = pE;
pB->right = pF;
return pA;
}
//前序遍历此树:根 左 右
void preOrder(BTree pT) {
//如果pT == nullptr,则什么也不做
if (pT != nullptr) {
//此处打印其值,也可以执行其他操作
cout << pT->val;
preOrder(pT->left);
preOrder(pT->right);
}
}
//中序遍历此树:左 根 右
void inOrder(BTree pT) {
if (pT != nullptr) {
inOrder(pT->left);
cout << pT->val;
inOrder(pT->right);
}
}
//后序遍历此树:左 右 根
void postOrder(BTree pT) {
if (pT != nullptr) {
postOrder(pT->left);
postOrder(pT->right);
cout << pT->val;
}
}
/*
求树的深度,这里树的深度看你怎么定义了
《数据结构与算法分析》中定义一棵树的深度为它的最深的树叶的
深度,根节点的深度为0,即书的深度等于层数减一,以下实现是根节点的深度为1
*/
int getDepth(BTree pT) {
int LD, RD;
if (pT == nullptr) {
return 0;
}
else {
LD = getDepth(pT->left);
RD = getDepth(pT->right);
return (LD > RD ? LD : RD) + 1;
}
}
//前序遍历查找key,q存储值等于key的元素的指针,如果没找到,则等于nullptr
void preSearch(BTree pT, BTNode *&q, char key) {
if (pT != nullptr) {
if (pT->val == key) {
q = pT;
}
else {
preSearch(pT->left, q, key);
if (q == nullptr) {
preSearch(pT->right, q, key);
}
}
}
}
//中序遍历查找key
void inSearch(BTree pT, BTNode *&q, char key) {
if (pT != nullptr) {
inSearch(pT->left, q, key);
if (q == nullptr) {
if (pT->val == key) {
q = pT;
}
else {
inSearch(pT->right, q, key);
}
}
}
}
//后序遍历查找key
void postSearch(BTree pT, BTNode *&q, char key) {
if (pT != nullptr) {
postSearch(pT->left, q, key);
if (q == nullptr) {
postSearch(pT->right, q, key);
if (q == nullptr && pT->val == key) {
q = pT;
}
}
}
}
int main() {
BTree pTree = createTree();
char key;
BTNode *q = nullptr;
cout << "前序序列:";
preOrder(pTree);
cout << endl;
cout << "中序序列:";
inOrder(pTree);
cout << endl;
cout << "后序序列:";
postOrder(pTree);
cout << endl;
cout << "二叉树的深度:";
cout << getDepth(pTree) << endl;
cout << "请输入要查找的值(A-Z):";
cin >> key;
preSearch(pTree, q, key);
if (q != nullptr) {
cout << "前序查找成功" << endl;
}
else {
cout << "前序查找失败" << endl;
}
inSearch(pTree, q, key);
if (q != nullptr) {
cout << "中序查找成功" << endl;
}
else {
cout << "中序查找失败" << endl;
}
postSearch(pTree, q, key);
if (q != nullptr) {
cout << "后序查找成功" << endl;
}
else {
cout << "后序查找失败" << endl;
}
return 0;
}
output:
前序序列:ACDEBF
中序序列:DCEABF
后序序列:DECFBA
二叉树的深度:3
请输入要查找的值(A-Z):A
前序查找成功
中序查找成功
后序查找成功
请按任意键继续. . .
参考:https://blog.youkuaiyun.com/wardseptember/article/details/78872111