二叉树题目总结(一)
1. 线索化二叉树
一颗有n个节点的二叉树,必然有n + 1个空指针,可以利用这些空指针记录二叉树的某种遍历序的前驱和(或)后继信息
下面给出中序线索化二叉树的代码:
1 #include <iostream> 2 3 struct ThreadTreeNode { 4 int val; 5 bool ltag; /* 0 for link, 1 for thread */ 6 bool rtag; 7 ThreadTreeNode *left; 8 ThreadTreeNode *right; 9 ThreadTreeNode(int v = -1) : val(v), ltag(0), rtag(0), left(NULL), right(NULL) { } 10 }; 11 12 class Solution { 13 public: 14 void *inorderThreadMirror(ThreadTreeNode *root) { 15 if(!root) return NULL; 16 ThreadTreeNode *prev = NULL; 17 ThreadTreeNode *curr = root; 18 while(curr) { 19 if(!curr->left) { 20 curr->ltag = 1; /* no left child threaded it */ 21 curr->left = prev; /* if curr is the first node in inorder, its prev is NULL */ 22 prev = curr; 23 curr = curr->right; 24 } 25 else { 26 ThreadTreeNode *temp = curr->left; 27 while(temp->right && temp->right != curr) temp = temp->right; 28 if(!temp->right) { /* has not been visited */ 29 temp->rtag = 1; 30 temp->right = curr; 31 curr = curr->left; 32 } 33 else { /* has been visited */ 34 prev = curr; 35 curr = curr->right; 36 } 37 } 38 } 39 } 40 void inorderTraversal(ThreadTreeNode *root) { 41 while(root && root->ltag != 1) root = root->left; /* find the first node in inorder */ 42 while(root) { 43 std::cout << root->val << " "; 44 if(!root->right) break; /* right node in NULL, says that its the last node */ 45 if(root->rtag == 1) /* thread */ 46 root = root->right; 47 else { /* link */ 48 root = root->right; 49 while(root && root->ltag != 1) root = root->left; 50 } 51 } 52 std::cout << std::endl; 53 } 54 }; 55 56 int main() { 57 ThreadTreeNode *root = new ThreadTreeNode(0); 58 root->left = new ThreadTreeNode(1); 59 root->right = new ThreadTreeNode(2); 60 root->left->left = new ThreadTreeNode(3); 61 root->left->right = new ThreadTreeNode(4); 62 root->left->right->left = new ThreadTreeNode(5); 63 root->left->right->right = new ThreadTreeNode(6); 64 Solution s; 65 s.inorderThreadMirror(root); 66 s.inorderTraversal(root); 67 return 0; 68 }
2. 求二叉树节点间的最大距离
对任一个节点,计算该节点到左边的最大距离+到右边的最大距离,保存起来,但只返回到左边或到右边的最大距离
1 #include <iostream> 2 3 struct TreeNode { 4 int val; 5 TreeNode *left; 6 TreeNode *right; 7 TreeNode(int v = -1) : val(v), left(NULL), right(NULL) { } 8 }; 9 10 class Solution { 11 public: 12 Solution() {r_max = 0;} 13 14 int maxDistanceDFS(TreeNode *root) { 15 dfs(root); 16 return r_max; 17 } 18 int maxDistance(TreeNode *root) { 19 if(!root) return 0; 20 int a = maxDep(root->left) + maxDep(root->right); 21 int b = maxDistance(root->left); 22 int c = maxDistance(root->right); 23 return std::max(std::max(a, b), c); 24 } 25 int r_max; 26 private: 27 int maxDep(TreeNode *root) { 28 if(!root) return 0; 29 return std::max(maxDep(root->left), maxDep(root->right)) + 1; 30 } 31 int dfs(TreeNode *root) { 32 if(!root) return 0; 33 int l = dfs(root->left); 34 int r = dfs(root->right); 35 r_max = std::max(r_max, l + r); 36 return l > r ? l + 1 : r + 1; 37 } 38 }; 39 40 int main() { 41 TreeNode *root = new TreeNode(1); 42 root->right = new TreeNode(3); 43 root->right->left = new TreeNode(4); 44 root->right->right = new TreeNode(5); 45 root->right->left->left = new TreeNode(6); 46 root->right->left->right = new TreeNode(7); 47 root->right->right->right = new TreeNode(8); 48 std::cout << (new Solution)->maxDistanceDFS(root) << std::endl; 49 std::cout << (new Solution)->maxDistance(root) << std::endl; 50 return 0; 51 }
3. 最近公共祖先
1 #include <iostream> 2 3 struct TreeNode { 4 int val; 5 TreeNode *left; 6 TreeNode *right; 7 TreeNode(int v = -1) : val(v), left(NULL), right(NULL) { } 8 }; 9 10 class Solution { 11 public: 12 TreeNode *commonForefather(TreeNode *root, TreeNode *childa, TreeNode *childb) { 13 if(isHere(root->left, childa) && isHere(root->left, childb)) { 14 if(root->left == childa || root->left == childb) 15 return root; 16 return commonForefather(root->left, childa, childb); 17 } 18 else if(isHere(root->right, childa) && isHere(root->right, childb)) { 19 if(root->right == childa || root->right == childb) 20 return root; 21 return commonForefather(root->right, childa, childb); 22 } 23 else 24 return root; 25 } 26 private: 27 bool isHere(TreeNode *root, TreeNode *child) { 28 if(root == child) 29 return true; 30 if(root == NULL) 31 return false; 32 return isHere(root->left, child) || isHere(root->right, child); 33 } 34 }; 35 36 int main() { 37 TreeNode *root = new TreeNode(1); 38 root->left = new TreeNode(2); 39 root->right = new TreeNode(3); 40 root->right->left = new TreeNode(4); 41 root->right->left->left = new TreeNode(5); 42 root->right->left->right = new TreeNode(6); 43 std::cout << (new Solution)->commonForefather(root, root->right->left->left, root->right->left)->val << std::endl; 44 return 0; 45 }
4. 二叉树的高度和宽度
高度定义为二叉树的最大深度
宽度定义为高度相同节点数目的最大值
1 #include <iostream> 2 #include <queue> 3 4 struct TreeNode{ 5 int val; 6 TreeNode *left; 7 TreeNode *right; 8 TreeNode(int v = -1) : val(v), left(NULL), right(NULL) { } 9 }; 10 11 class Solution { 12 public: 13 int biTreeDep(TreeNode *root) { 14 if(!root) return 0; 15 return std::max(biTreeDep(root->left), biTreeDep(root->right)) + 1; 16 } 17 int biTreeWidth(TreeNode *root) { 18 if(!root) return 0; 19 std::queue<TreeNode *> que; 20 int maxWidth = 0; 21 int curWidth = 0; 22 que.push(root); 23 que.push(NULL); 24 while(!que.empty()) { 25 while(que.front()) { 26 TreeNode *curr = que.front(); 27 que.pop(); 28 curWidth++; 29 if(curr->left) que.push(curr->left); 30 if(curr->right) que.push(curr->right); 31 } 32 maxWidth = std::max(maxWidth, curWidth); 33 curWidth = 0; 34 que.pop(); 35 if(que.empty()) break; 36 que.push(NULL); 37 } 38 return maxWidth; 39 } 40 }; 41 42 int main() { 43 TreeNode *root = new TreeNode(1); 44 root->left = new TreeNode(2); 45 root->right = new TreeNode(3); 46 root->right->right = new TreeNode(4); 47 root->right->right->left = new TreeNode(5); 48 root->right->right->left->right = new TreeNode(6); 49 Solution s; 50 std::cout << s.biTreeDep(root) << std::endl; 51 std::cout << s.biTreeWidth(root) << std::endl; 52 return 0; 53 }
5. Huffman编码
1 #include <iostream> 2 #include <vector> 3 #include <queue> 4 #include <map> 5 using namespace std; 6 7 typedef unsigned int uint; 8 struct HuffTreeNode { 9 uint weight; 10 HuffTreeNode *lchild; 11 HuffTreeNode *rchild; 12 HuffTreeNode *parent; 13 HuffTreeNode(uint w = 0) : weight(w), lchild(NULL), rchild(NULL), parent(NULL) { } 14 }; 15 struct Cmp { 16 bool operator() (const HuffTreeNode *a, const HuffTreeNode *b) { 17 return a->weight > b->weight; 18 } 19 }; 20 class Solution { 21 public: 22 HuffTreeNode* createHuffmanCodingTree(const vector<uint> &weight) { 23 priority_queue<HuffTreeNode *, vector<HuffTreeNode *>, Cmp > pri_que; 24 HuffTreeNode *prev = NULL; 25 HuffTreeNode *curr = NULL; 26 for(int i = 0; i < weight.size(); i++) 27 pri_que.push(new HuffTreeNode(weight[i])); 28 while(!pri_que.empty()) { 29 prev = pri_que.top(), pri_que.pop(); 30 if(pri_que.empty()) break; 31 curr = pri_que.top(), pri_que.pop(); 32 HuffTreeNode *parent = new HuffTreeNode(prev->weight + curr->weight); 33 parent->lchild = prev->lchild ? curr : prev; 34 parent->rchild = prev->lchild ? prev : curr; 35 prev->parent = curr->parent = parent; 36 pri_que.push(parent); 37 } 38 this->root = prev; 39 return prev; 40 } 41 void createHuffmanEncodeMap() { 42 string bits; 43 HuffTreeNode *curr = this->root; 44 while(curr) { 45 if(!curr->lchild) { 46 encode_map[curr->weight] = bits; 47 curr = curr->rchild; 48 } 49 else { 50 HuffTreeNode *temp = curr->lchild; 51 int backlevel = 1; 52 while(temp->rchild && temp->rchild != curr) temp = temp->rchild, backlevel++; 53 if(!temp->rchild) { 54 /* visit curr */ 55 bits += "0"; 56 temp->rchild = curr; 57 curr = curr->lchild; 58 } 59 else { 60 /* trace back to "root" node */ 61 bits = bits.substr(0, bits.size() - backlevel); 62 bits += "1"; 63 temp->rchild = NULL; 64 curr = curr->rchild; 65 } 66 } 67 } 68 } 69 private: 70 map<uint, string> encode_map; 71 map<string, uint> decode_map; 72 HuffTreeNode *root; 73 }; 74 75 int main(int argc, char **argv) { 76 vector<uint> v_ui; 77 v_ui.push_back(5); 78 v_ui.push_back(29); 79 v_ui.push_back(7); 80 v_ui.push_back(8); 81 v_ui.push_back(14); 82 v_ui.push_back(23); 83 v_ui.push_back(3); 84 v_ui.push_back(11); 85 Solution s; 86 s.createHuffmanCodingTree(v_ui); 87 s.createHuffmanEncodeMap(); 88 for(int i = 0; i < v_ui.size(); i++) 89 cout << v_ui[i] << " : " << s.encode_map[v_ui[i]] << endl; 90 return 0; 91 }
由于本人水平有限,文中不当和错误之处难以避免,欢迎大家批评指正,愿共同进步!!!