首页 > 代码库 > IT公司100题-tencent-打印所有高度为2的路径

IT公司100题-tencent-打印所有高度为2的路径

问题描述:

打印所有到叶子节点长度为2的路径
    10
   /  \
  6   16
  / \   / \
 4 8  14 18
  / \    / \    \
2  5  12 15 20
   /
  11
 
打印:

[10 6 8]

[6 4 2]

[6 4 5]

[16 14 15]

[16 18 20]

[14 12 11]

 
分析:
1, 对于树先做先序遍历。
2, 然后针对每个节点做检查,检查的内容是,是否含有长度为2的叶子节点路径。
3, 检查的过程是,设定一个depth,同时保存当前root节点,递归遍历每个子节点,每次递归depth+1,push当前root节点,如果depth为n,当前节点为叶子节点,则打印出来,否则如果depth<n,就继续遍历子节点,跟随每次入栈操作的是:1, depth+1 2, push_back(root)。如果depth>=n,就不继续遍历,同时跟随函数调用结束出栈的操作是:1,depth-1 2,pop当前节点。
 
代码实现:
  1 #include <iostream>  2 #include "../utility/printCollection.h"  3 using namespace std;  4   5 struct bsnode{  6     int data;  7     bsnode* left;  8     bsnode* right;  9 }; 10  11 void add_bsnode(bsnode* &root, int value) 12 { 13     if(root == NULL) 14     { 15         bsnode* tmp = new bsnode(); 16         tmp->data =http://www.mamicode.com/ value; 17         tmp->left = NULL; 18         tmp->right = NULL; 19         root = tmp; 20         return; 21     } 22     if(value > root->data) 23         add_bsnode(root->right, value); 24     else if(value < root->data) 25         add_bsnode(root->left, value); 26     else 27         cout << "duplicate value" << endl; 28 } 29  30 void print_tree(bsnode* root) 31 { 32     if(root == NULL) 33         return; 34     if(root->left != NULL) 35         print_tree(root->left); 36     cout << root->data << " "; 37     if(root->right != NULL) 38         print_tree(root->right); 39 } 40  41  42 void check_node(bsnode* root, int n, int &depth, vector<int> &path) 43 { 44     //如果当前深度>n,不需要继续访问 45     if(depth > n || root == NULL) 46         return; 47  48     //检查前压栈当前节点,depth+1 49     path.push_back(root->data); 50     depth++; 51  52     //如果当前深度=n 53     if(depth == n) 54         if(root->left == NULL && root->right == NULL) 55         { 56             cout << "path found: " << endl; 57             printCollection(path); 58             cout << endl;             59         } 60  61     //如果当前深度<n 62     if(depth < n) 63         if(root->left != NULL) 64             check_node(root->left, n, depth, path); 65         if(root->right != NULL) 66             check_node(root->right, n, depth, path); 67  68     //检查完出栈当前节点,depth-1 69     path.pop_back(); 70     depth--; 71     return; 72 } 73  74 void print_node(bsnode* root, int n) 75 { 76     if(root == NULL) 77         return; 78  79     //每次检查前重定义depth 80     int depth = -1; 81     vector<int> path; 82  83     //每次检查前clear path 84     path.clear(); 85  86     //检查当前节点的所有叶子节点的高度 87     check_node(root, n, depth, path); 88      89     //递归检查左子树 90     print_node(root->left, n); 91     //递归检查右子树 92     print_node(root->right, n); 93 } 94  95  96 int main() 97 { 98     bsnode* root = NULL; 99     add_bsnode(root, 10);    100     add_bsnode(root, 6);101     add_bsnode(root, 16);102     add_bsnode(root, 4);103     add_bsnode(root, 8);104     add_bsnode(root, 14);105     add_bsnode(root, 18);106     add_bsnode(root, 2);107     add_bsnode(root, 5);108     add_bsnode(root, 12);109     add_bsnode(root, 15);110     add_bsnode(root, 20);111     add_bsnode(root, 11);112 113     cout << "Tree content: " << endl;114     print_tree(root);115     cout << endl << endl;116 117     int height = 2; 118     cout << "Nodes that with height " << height << " are:" << endl;119     print_node(root, height);120     cout << endl;121 }

 

输出:

$ ./a.exeTree content:2 4 5 6 8 10 11 12 14 15 16 18 20Nodes that with height 2 are:path found:[10 6 8]path found:[6 4 2]path found:[6 4 5]path found:[16 14 15]path found:[16 18 20]path found:[14 12 11]

 

IT公司100题-tencent-打印所有高度为2的路径