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 = 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.exe
Tree content:
2 4 5 6 8 10 11 12 14 15 16 18 20

Nodes 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]
时间: 2024-10-24 10:02:40

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

IT公司100题-15-求二元查找树的镜像

问题描述: 输入一颗二元查找树,将该树转换为它的镜像树,即对每一个节点,互换左右子树. 例如输入: 6/    \4     12/ \   /   \2  5 8   16 输出: 6/     \12     4/   \   / \16  8 5  2 定义二元查找树的结点为: typedef struct BSTree { int data; BSTree* left; BSTree* right; } Node; 分析: 方法1:递归交换左右子树. // 15_1.cc #includ

IT公司100题-16-层遍历二元树

问题描述: 层遍历二叉树,同一层从左往右打印. 定义二元查找树的结点为: typedef struct BSTreeNode { int data; BSTreeNode *left; BSTreeNode *right; } Node; 例如输入二叉树: 6 /   \ 4    12/ \    / \2 5 8  16 输出:6 4 12 2 5 8 16. 分析: 二叉树的广度优先遍历. 代码实现: 1 // 16.cc 2 #include <deque> 3 #include &l

IT公司100题-4

题目:输入一个整数和一棵二元树.从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径.打印出和与输入整数相等的所有路径. 例如输入整数22和如下二元树                                              10                                             /    \                                            5      12                 

IT公司100题-14-排序数组中和为给定值的两个数字

问题描述: 输入一个升序排序的数组,给定一个目标值target,求数组的两个数a和b,a+b=target.如果有多个组合满足这个条件,输出任意一对即可. 例如,输入升序数组[1, 3, 4, 5, 13, 17]和目标值20.输出3和17. 分析: 最简单的办法,直接遍历,时间复杂度为O(n^2). 双下标法:low和high a[low]+a[high] < target, low++; a[low]+a[high] > target, high–; a[low]+a[high] == t

IT公司100题-12-求1+2+…+n

问题描述: 求1+2+…+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A?B:C). 分析: 利用类的静态变量实现: new一含有n个这种类的数组,那么该类的构造函数将会被调用n次. 代码实现: 1 // 12.cc 2 #include <iostream> 3 using namespace std; 4 5 class Object { 6 public: 7 Object() { 8 ++N; 9 Sum += N; 10

IT公司100题-13-求链表中倒数第k个结点

问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法1: 首先计算出链表中节点的个数n,然后倒数第k个节点,为正数n-k+1个节点. 需要遍历链表2次. 方法1代码实现: 1 // 13_1.cc 2 #include <iostream> 3 using namespace std; 4 5 struct list_node { 6 int da

IT公司100题-11-求二叉树中节点的最大距离

问题描述: 写程序,求一棵二叉树中相距最远的两个节点之间的距离. 10/     \6      14/   \   /   \4    8 12    16 分析: 二叉树中最远的两个节点,要么是根和一个叶子节点,要么是两个叶子节点. 代码实现: 1 // 11.cc 2 #include <iostream> 3 using namespace std; 4 5 typedef struct BSTreeNode { 6 int data; 7 BSTreeNode *left; 8 BS

IT公司100题-3

题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18. 分析:本题最初为2005年浙江大学计算机系的考研题的最后一道程序设计题,在2006年里包括google在内的很多知名公司都把本题当作面试题.由于本题在网络中广为流传,本题也顺利成为2006

IT公司100题-2

1 // 定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素. 2 // 要求函数min.push 以及pop 的时间复杂度都是O(1). 3 #include <iostream> 4 #include "../data/own/c2_list.h" 5 using namespace std; 6 7 template <typename object> 8 class miniStack{ 9 public: 10 bool isEmpty(