struct Bi Node string data Bi Node lchild
struct Bi. Node { string data; Bi. Node *lchild, *rchild; }; typedef Bi. Node *Bi. Tree; int Init. Bi. Tree(Bi. Tree &T) { T = NULL; return 0; }
int Pre. Traverse(Bi. Tree T) { if (T == NULL) return 0; cout << T->data << endl; Pre. Traverse(T->lchild); Pre. Traverse(T->rchild); return 0; } int In. Traverse(Bi. Tree T) { if (T == NULL) return 0; In. Traverse(T->lchild); cout << T->data << endl; In. Traverse(T->rchild); return 0; } int Suc. Traverse(Bi. Tree T) { if (T == NULL) return 0; Suc. Traverse(T->lchild); Suc. Traverse(T->rchild); cout << T->data << endl; return 0; }
int Destroy. Bi. Tree(Bi. Tree &T) { if (T == NULL) return 0; Destroy. Bi. Tree(T->lchild); Destroy. Bi. Tree(T->rchild); delete T; T = NULL; return 0; } int Get. Depth(Bi. Tree T) { if (T == NULL) return 0; return max(Get. Depth(T->lchild), Get. Depth(T->rchild)) + 1; } int Get. Node. Number(Bi. Tree T) { if (T == NULL) return 0; return Get. Node. Number(T->lchild) + Get. Node. Number(T->rchild) + 1; }
// 用带虚结点的前序遍历串str(每个字符对应一个结点)构造二叉树T,并返回剩余字符串 char *Create. Bi. Tree(Bi. Tree &T, char *str) { // 约定#表示空结点 if (*str == '#') { T = NULL; return str + 1; } // 创建结点 T = new Bi. Node; T->data = *str; // 继续输入并构造左子树和右子树 char * str. After. Left = Create. Bi. Tree(T->lchild, str + 1); char * str. After. Right = Create. Bi. Tree(T->rchild, str. After. Left); // 返回剩余的字符串 return str. After. Right; } abd###ceg##h##f#i##
Bi. Tree Create. Bi. Tree(const char *prestr, const char *midstr, int n) { if (n <= 0) return nullptr; // 创建根结点 Bi. Tree T = new Bi. Node; T->data = *prestr; // 在中序遍历序列中确定根结点的位置(假定输入没有错误) int rootpos = -1; for (int i = 0; i < n; i++) { if (midstr[i] == *prestr) { rootpos = i; break; } } prestr 前序遍历序:abdceghfi 中序遍历序:dbagehcfi rootpos // 分别创建左子树和右子树 T->lchild = Create. Bi. Tree(prestr + 1, midstr, rootpos); T->rchild = Create. Bi. Tree(prestr + 1 + rootpos, midstr + 1 + rootpos, n - rootpos - 1); return T; } midstr
物种识别系统实现分析 Bi. Node *Start. Recognize(Bi. Tree T) { if (T == nullptr) return nullptr; Bi. Node *p = T; while (!Is. Leaf(p)) { cout << p->data << "(Y/N)"; string ans; getline(cin, ans); if (ans == "Y" || ans == "y") p = p->rchild; else p = p->lchild; } 它会�� ? return p; } 它是猛� �? 兔子 它是食肉 的�? 老虎 燕子 老�
int Create. Huffman. Tree(Huffman. Tree &T, int leafnumber, int *weights) { // 分配哈夫曼树存储空间 T. nodes = new Huffman. Node[leafnumber + leafnumber - 1]; T. leafnumber = leafnumber; #include <iostream> #include <algorithm> using namespace std; struct Huffman. Node { char info; int weight; int parent, lchild, rchild; }; // 定义结点的排序规则,sort算法需要使用这个重载的运算符 bool operator<(const Huffman. Node &node 1, const Huffman. Node &node 2) { return node 1. weight < node 2. weight; } // 初始化叶结点 for (int i = 0; i < leafnumber; i++) { T. nodes[i]. info = 'a' + i; T. nodes[i]. weight = weights[i]; T. nodes[i]. parent = T. nodes[i]. lchild = T. nodes[i]. rchild = -1; } // 将叶结点按权值排序 sort(T. nodes, T. nodes + leafnumber); // 开始构造哈夫曼树 int s = 0, t = leafnumber; // 分别用来遍历叶结点和非叶结点 for (int i = 0; i < leafnumber - 1; i++) { // 选择第一个权值最小的根结点 int k 1; if (s < leafnumber && (t >= leafnumber + i || T. nodes[s]. weight < T. nodes[t]. weight)) k 1 = s++; else k 1 = t++; struct Huffman. Tree { Huffman. Node *nodes; int leafnumber; }; s 3 // 选择第二个权值最小的根结点 int k 2; if (s < leafnumber && (t >= leafnumber + i || T. nodes[s]. weight < T. nodes[t]. weight)) k 2 = s++; else k 2 = t++; t 6 7 8 21 9 15 24 // 将根结点k 1, 根结点k 2合并到新增根结点i + leafnumber下 T. nodes[i + leafnumber]. weight = T. nodes[k 1]. weight + T. nodes[k 2]. weight; T. nodes[i + leafnumber]. parent = -1; T. nodes[i + leafnumber]. lchild = k 1; T. nodes[i + leafnumber]. rchild = k 2; T. nodes[k 1]. parent = i + leafnumber; T. nodes[k 2]. parent = i + leafnumber; 45 } return 0; }
四、哈夫曼树 哈夫曼编码 编码构造 信息编码 信息解码 aebaeceddec 发送方 a: 100 b: 110 c: 111 d: 101 e: 0 aebaeceddec 10001101000111010111 接收方
- Slides: 32