首页 > 代码库 > 二叉树题目总结(一)

二叉树题目总结(一)

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         else24             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 }

 

由于本人水平有限,文中不当和错误之处难以避免,欢迎大家批评指正,愿共同进步!!!

 

二叉树题目总结(一)