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);
}
}