目录
应用操作汇总:
二叉树的建立(DLR先序遍历,递归算法)
二叉树的复制
求二叉树的深度
求二叉树的结点数
求二叉树的叶子结点数
自己多动手写写吧(记住要手撸默写哦)
前置条件:
#include<iostream>
using namespace std;
typedef int Status;
#define MAXTSIZE 100
typedef char TElemtype;//Tree Elemtype
//根据需求情况修改
typedef TElemtype SqBiTree;//sequence binary tree
//binary:二进制的; 二元的; 由两部分组成的;
SqBiTree bt;//binary tree
struct BiNode//二叉链表存储结构
{
TElemtype data;
struct
BiNode* lchild, * rchild;
//左右孩子指针
};
typedef BiNode * BiTree;
struct TriNode//trinary:三元的
{
TElemtype data;
struct
BiNode* lchild, * rchild,* parent;
};
typedef TriNode* TriTree;
int main()
{
}
创建二叉树:
Status CreatBiTree(BiTree& T)
{
char input;
cin >> input;
if (input == '#')
return false;
T = new BiNode;
T->data = input;//D
CreatBiTree(T->lchild);//L
//嵌套
CreatBiTree(T->rchild);//R
//嵌套
return true;
}
嵌套:
调用没有执行完就又套用了一层调用
里面套的下一层调用执行完毕了以后
程序再返回到前面开始写这个嵌套(套娃)的语句之后
继续往下执行
二叉树的复制
int Copy(BiTree T, BiTree& NewT)
{
if (T == NULL)
{
NewT = NULL;
return 0;
}
else
{
NewT = new BiNode;
NewT->data = T->data;
Copy(T->lchild, NewT->lchild);
Copy(T->rchild, NewT->rchild);
}
return 1;
}
&表示返回传递??不是形参实参和指针都能表示返回传递吗
求二叉树的深度(以下几个算法有点难度,多看看)
int Depth(BiTree& T)
{
if (T == NULL)
return 0;
else
{
int m = Depth(T->lchild);
int n = Depth(T->rchild);
if (m > n)
return m + 1;
else
return n + 1;
}
}
二叉树 = 根结点+左子树+右子树;
右子树 = 根结点+左子树+右子树
左子树 = 根结点+左子树+右子树......如此循环反复
思想:嵌套思想,第一性原理(拆解简化实现完成不可能的功能)
把一个复杂二叉树的运算求解问题
分解成一个个的单结点二叉树(叶子结点)问题的累加(用递归函数一层层分解二叉树)
求二叉树的结点数
int NodeCount(BiTree T)//有点难度,多看看
{
if (T == NULL)
return 0;
else
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
求二叉树的叶子结点数
int LeafNodeCount(BiTree T)
{
if (T == NULL)
return 0;
if (T->lchild == NULL && T->rchild == NULL)
return 1;
else
return LeafNodeCount(T->lchild) + LeafNodeCount(T->rchild);
}
线索二叉树
结构定义:
struct BiThrNode
//Threaded binary tree:线索二叉树
{
int data;
int ltag, rtag;
struct BiTrNode* lchild, * rchild;
};
typedef BiThrNode * BiThrTree;
thread:
有螺纹的;穿(针);(使)穿过; 通过; 穿行; 穿成串; 串在一起