1.二叉树-----普通树
1.1 二叉树长什么样子
1.1.1 空二叉树
1.1.2 只有根结点的二叉树
1.1.3 只有左子树
1.1.4 只有右子树
1.1.5 左右子树都健全
满二叉树 除了叶子节点之外,所有节点都是满的
完全二叉树 除了最后一个节点以及叶子节点,剩下的结点要是满的
1.2 基本概念
1.2.1 根结点
1.2.2 左子树指针,右子树指针,左子树,右子树
1.2.3 兄弟节点/姊妹节点
1.2.4 双亲结点(存在父子关系)
1.2.5 父节点,和孩子结点
1.2.6 深度和广度
深度(高度):多少层数--->描述树
广度:多宽,用线的 个数--->描述结点
1.3 一些数学规律
1.3.1 二叉树有n个结点 n>0; n-1个边
1.3.2 二叉树深度(高度) h,h>0 h<=元素个数<=2^h-1
1.3.3 二叉树结点为n个,n>0,最大深度n, 最小深度 log2(n+1)
1.3.4 二叉树的编号: 1<=i<=n;
1.3.4.1 i=1 根结点 假设孩子结点的序号是iChild 父节点序号就是iChild/2
1.3.4.2 2i>n 序号为i的结点没有左孩子
1.3.4.3 2i+1>n i元素没有右孩子
2.存储
3.遍历
3.1 先序(前序)
根--左--右
3.2 中序
左--根--右
3.3 后序
点击链接加入群获取更多学习内容。
1.1 二叉树长什么样子
1.1.1 空二叉树
1.1.2 只有根结点的二叉树
1.1.3 只有左子树
1.1.4 只有右子树
1.1.5 左右子树都健全
满二叉树 除了叶子节点之外,所有节点都是满的
完全二叉树 除了最后一个节点以及叶子节点,剩下的结点要是满的
1.2 基本概念
1.2.1 根结点
1.2.2 左子树指针,右子树指针,左子树,右子树
1.2.3 兄弟节点/姊妹节点
1.2.4 双亲结点(存在父子关系)
1.2.5 父节点,和孩子结点
1.2.6 深度和广度
深度(高度):多少层数--->描述树
广度:多宽,用线的 个数--->描述结点
1.3 一些数学规律
1.3.1 二叉树有n个结点 n>0; n-1个边
1.3.2 二叉树深度(高度) h,h>0 h<=元素个数<=2^h-1
1.3.3 二叉树结点为n个,n>0,最大深度n, 最小深度 log2(n+1)
1.3.4 二叉树的编号: 1<=i<=n;
1.3.4.1 i=1 根结点 假设孩子结点的序号是iChild 父节点序号就是iChild/2
1.3.4.2 2i>n 序号为i的结点没有左孩子
1.3.4.3 2i+1>n i元素没有右孩子
2.存储
3.遍历
3.1 先序(前序)
根--左--右
3.2 中序
左--根--右
3.3 后序
左--右--根
#include <iostream>
using namespace std;
template <typename T>
struct binaryTreeNode
{
//数据域
T element;
//指针域
binaryTreeNode<T>* leftChild; //左子树指针
binaryTreeNode<T>* rightChild; //右子树指针
//构造函数负责给基本数据成员初始化
binaryTreeNode()
{
leftChild = rightChild = nullptr;
}
binaryTreeNode(const T& element) :element(element)
{
leftChild = rightChild = nullptr;
}
binaryTreeNode(const T& element, binaryTreeNode<T>* leftChild, binaryTreeNode<T>* rightChild)
{
this->element = element;
this->leftChild = leftChild;
this->rightChild = rightChild;
}
};
template <typename T>
void printData(binaryTreeNode<T>* x)
{
cout << x->element <<"\t";
}
template <typename T>
void preOrder(binaryTreeNode<T>* tree)
{
//1.通过参数递推来产生递归
//2.通过返回值得
if (tree != nullptr)
{
printData(tree); //打印数据
preOrder(tree->leftChild); //左
preOrder(tree->rightChild); //右
}
}
template <typename T>
void midOrder(binaryTreeNode<T>* tree)
{
if (tree != nullptr)
{
midOrder(tree->leftChild); //左
printData(tree);
midOrder(tree->rightChild); //右
}
}
template <typename T>
void lastOrder(binaryTreeNode<T>* tree)
{
if (tree != nullptr)
{
lastOrder(tree->leftChild); //左
lastOrder(tree->rightChild); //右
printData(tree);
}
}
// 求树的深度
//删除树
int main()
{
//普通数据,二叉树的存储
binaryTreeNode<char> *G = new binaryTreeNode<char>('G');
binaryTreeNode<char> *F = new binaryTreeNode<char>('F', nullptr, G);
binaryTreeNode<char> *E = new binaryTreeNode<char>('E');
binaryTreeNode<char> *D = new binaryTreeNode<char>('D');
binaryTreeNode<char> *C = new binaryTreeNode<char>('C', F, nullptr);
binaryTreeNode<char> *B = new binaryTreeNode<char>('B', D, E);
binaryTreeNode<char> *A = new binaryTreeNode<char>('A', B, C);
cout << "先序遍历:" << endl;
preOrder(A);
cout <<endl<< "中序遍历:" << endl;
midOrder(A);
cout <<endl<< "后序遍历:" << endl;
lastOrder(A);
system("pause");
return 0;
}
点击链接加入群获取更多学习内容。