[数据结构][树]链表模拟二叉树及其基本操作
原创
©著作权归作者所有:来自51CTO博客作者俺叫西西弗斯的原创作品,请联系作者获取转载授权,否则将追究法律责任
A.注释
① 深刻理解二叉树的定义、性质及其存储方法;
② 熟练掌握二叉树的二叉链表存储方式、结点结构类型的定义;
③ 理解并掌握二叉树的三种遍历算法的递归实现及非递归实现;
④ 掌握二叉树的线索化方法;
⑤ 灵活运用二叉树遍历方法中递归实现的程序框架及应用(求总结点、叶子节点和二叉树深度)。(重点)
⑥ 深刻理解树的定义、术语;
⑦ 领会并掌握树的各种存储结构;
⑧ 熟练掌握森林与二叉树间的相互转换;
⑨ 领会树和森林的遍历;
⑩ 掌握哈夫曼树及哈夫曼编码。
1.定义
1.1Binary Tree
n(n>0) 个节点组成的集合,它或成为 空 树,或称为 非空树
对于非空树
有且仅有一个称之为 根(root) 的节点
其余节点 分为不相交的子集 T1 T2 分别成为 T 的 左子树 由子树 且本身都是二叉树
1.2与 树 的区别
每个节点至多两个子树
子树 油左右之分 次序不能任意颠倒
1.3性质
在 第i层 至多有 2^i-1 个结点 (i>=1)
深度为K的二叉树至多有2^K-1 个结点
对于任何一个二叉树T,如果终端节点数为n0,度为2的节点数为n2,则n0=n2+1
存储方法
链式
B.CPP代码
1.
刚才写成了
struct BiTree *lchild, *rchild;
}BiTNode,*BiTree;
于是就在 InOrderTraverze(BiTree T) 参数部分出错了 我不知道为啥 (笑
2.
我之前不知道为什么 有些 要用 void ?
我看void InOrderTraverze 的时候明白了 这他妈根本没有需要返回值判断错误的可能...
3.
void CreatBiTree(BiTree &T)
{
//这里用的是 先序遍历方式 什么 你问什么是先序遍历?
//就是把上面的cout和他上面一行换个位置
char ch;
cin >> ch;
if (ch == '#') T = NULL; //空树
else
{
T = new BiTNode;
T->data = ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
太真实了 这个写法 想起DFS
4.
int NodeCount(BiTree T)
{
if (!T) return 0;
else return NodeCount(T->lchild) + NodeCount(T->rchild);
}
int petch(BiTree T)
{
if (!T) return 0;
else
{
int m = petch(T->lchild);
int n = petch(T->rchild);
if (m > n) return m + 1;
else return n + 1;
}
}
递归的性质太明显了 无处不在
5.
//这一段书本上的代码出现了错误!
//如果 T == NULL 返回 这样的话 NewT为空的情况将不会被复制!
if (!T) return 0;
太喜剧了 让夏渝蛟帮忙找了半天
Status Copy(BiTree T, BiTree &NewT)
{
//这一段书本上的代码出现了错误!
//如果 T == NULL 返回 这样的话 NewT为空的情况将不会被复制!
if (!T)
{
NewT = NULL;
return 0;
}
else
{
NewT = new BiTNode;
NewT->data = T->data;
Copy(T->lchild, NewT->lchild);
Copy(T->rchild, NewT->rchild);
}
}
C.编写日志
1.
刚才写成了
struct BiTree *lchild, *rchild;
}BiTNode,*BiTree;
于是就在 InOrderTraverze(BiTree T) 参数部分出错了 我不知道为啥 (笑
2.
我之前不知道为什么 有些 要用 void ?
我看void InOrderTraverze 的时候明白了 这他妈根本没有需要返回值判断错误的可能...
3.
void CreatBiTree(BiTree &T)
{
//这里用的是 先序遍历方式 什么 你问什么是先序遍历?
//就是把上面的cout和他上面一行换个位置
char ch;
cin >> ch;
if (ch == '#') T = NULL; //空树
else
{
T = new BiTNode;
T->data = ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
太真实了 这个写法 想起DFS
4.
int NodeCount(BiTree T)
{
if (!T) return 0;
else return NodeCount(T->lchild) + NodeCount(T->rchild);
}
int petch(BiTree T)
{
if (!T) return 0;
else
{
int m = petch(T->lchild);
int n = petch(T->rchild);
if (m > n) return m + 1;
else return n + 1;
}
}
递归的性质太明显了 无处不在
5.
//这一段书本上的代码出现了错误!
//如果 T == NULL 返回 这样的话 NewT为空的情况将不会被复制!
if (!T) return 0;
太喜剧了 让夏渝蛟帮忙找了半天
Status Copy(BiTree T, BiTree &NewT)
{
//这一段书本上的代码出现了错误!
//如果 T == NULL 返回 这样的话 NewT为空的情况将不会被复制!
if (!T)
{
NewT = NULL;
return 0;
}
else
{
NewT = new BiTNode;
NewT->data = T->data;
Copy(T->lchild, NewT->lchild);
Copy(T->rchild, NewT->rchild);
}
}