问题描述:

打印所有到叶子节点长度为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当前节点。
 
代码实现:
 #include <iostream>
#include "../utility/printCollection.h"
using namespace std; struct bsnode{
int data;
bsnode* left;
bsnode* right;
}; void add_bsnode(bsnode* &root, int value)
{
if(root == NULL)
{
bsnode* tmp = new bsnode();
tmp->data = value;
tmp->left = NULL;
tmp->right = NULL;
root = tmp;
return;
}
if(value > root->data)
add_bsnode(root->right, value);
else if(value < root->data)
add_bsnode(root->left, value);
else
cout << "duplicate value" << endl;
} void print_tree(bsnode* root)
{
if(root == NULL)
return;
if(root->left != NULL)
print_tree(root->left);
cout << root->data << " ";
if(root->right != NULL)
print_tree(root->right);
} void check_node(bsnode* root, int n, int &depth, vector<int> &path)
{
//如果当前深度>n,不需要继续访问
if(depth > n || root == NULL)
return; //检查前压栈当前节点,depth+1
path.push_back(root->data);
depth++; //如果当前深度=n
if(depth == n)
if(root->left == NULL && root->right == NULL)
{
cout << "path found: " << endl;
printCollection(path);
cout << endl;
} //如果当前深度<n
if(depth < n)
if(root->left != NULL)
check_node(root->left, n, depth, path);
if(root->right != NULL)
check_node(root->right, n, depth, path); //检查完出栈当前节点,depth-1
path.pop_back();
depth--;
return;
} void print_node(bsnode* root, int n)
{
if(root == NULL)
return; //每次检查前重定义depth
int depth = -;
vector<int> path; //每次检查前clear path
path.clear(); //检查当前节点的所有叶子节点的高度
check_node(root, n, depth, path); //递归检查左子树
print_node(root->left, n);
//递归检查右子树
print_node(root->right, n);
} int main()
{
bsnode* root = NULL;
add_bsnode(root, );
add_bsnode(root, );
add_bsnode(root, );
add_bsnode(root, );
add_bsnode(root, );
add_bsnode(root, );
add_bsnode(root, );
add_bsnode(root, );
add_bsnode(root, );
add_bsnode(root, );
add_bsnode(root, );
add_bsnode(root, );
add_bsnode(root, ); cout << "Tree content: " << endl;
print_tree(root);
cout << endl << endl; int height = ;
cout << "Nodes that with height " << height << " are:" << endl;
print_node(root, height);
cout << endl;
}

输出:

$ ./a.exe
Tree content: Nodes that with height are:
path found:
[ ] path found:
[ ] path found:
[ ] path found:
[ ] path found:
[ ] path found:
[ ]

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

  1. IT公司100题-32-交换元素,使数组差最小

    问题描述: 有两个整数序列a, b,大小都为n, 序列元素的值任意整数,无序. 要求:通过交换a, b 中的元素,使得sum(a)-sum(b),差最小. 例如: var a=[80, 40, 60, ...

  2. IT公司100题-21-输入n和m,和等于m

    问题描述: 输入两个整数n 和m,从数列1,2,3,…,n 中随意取几个数, 使其和等于m,将所有可能的组合都打印出来.   分析: 利用递归的思路,对于1,2,3,…,n 中的任意一个数,要么选,要 ...

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

    问题描述: 层遍历二叉树,同一层从左往右打印. 定义二元查找树的结点为: typedef struct BSTreeNode { int data; BSTreeNode *left; BSTreeN ...

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

    问题描述: 输入一颗二元查找树,将该树转换为它的镜像树,即对每一个节点,互换左右子树.   例如输入:   6/    \4     12/ \   /   \2  5 8   16 输出:   6/ ...

  5. IT公司100题-4-在二元树中找出和为某一值的所有路径

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

  6. IT公司100题-1-二叉树转换为双链表

    问题描述: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 10   /   \  6      14/  \    /   \4   8 1 ...

  7. IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)

    问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10   分析: 2*2子数组的最大和.遍历求和,时 ...

  8. IT公司100题-28-整数的二进制表示中1的个数

    问题描述: 输入一个整数n,求n的二进制表示中,一共有多少个1.例如n=8,二进制表示为00001000,二进制表示中有1个1.     分析: 如果一个数n不为0,那么n-1的二进制表示,与n的二进 ...

  9. IT公司100题-27-跳台阶问题

    问题描述: 一个台阶总共有n阶,一次可以跳1级或者2级.求总共有多少种跳法.   分析: 用f(n)表示n阶台阶总共有多少种跳法.n阶台阶,第一可以选择跳1阶或者2阶,则f(n) = f(n-1) + ...

随机推荐

  1. js 格式化数字保留2位小数

    function toDecimal2(x) { var f = parseFloat(x); if (isNaN(f)) { return false; } var f = Math.round(x ...

  2. jenkins+gerrit

    Verified 功能 http://www.cnblogs.com/zhanchenjin/p/5032218.html

  3. iOS禁用第三方键盘

    - (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString *)ext ...

  4. Testng使用方法示例

    TestNG TestNG是一个测试框架,灵感来自JUnit和NUnit.但引入了下面这些新的功能,使它更强大和更容易使用. 注解: 可在任意大的线程池运行您的测试(所有方法在它们自己的线程内,一个线 ...

  5. 关于无法把程序(Adobe Fireworks CS5)添加到打开方式的解决办法

    关于无法把程序(Adobe Fireworks CS5)添加到打开方式的解决办法 最近换了新版的Adobe Fireworks CS5,发现打开图片文件时在右键“打开方式”里仍然是以前的Firewor ...

  6. Python:C语言扩展

    1. 概述 Python 可以非常方便地和 C 进行相互的调用. 一般,我们不会使用 C 去直接编写一个 Python 的模块.通常的情景是,我们需要把 C 的相关模块包装一下,然后在 Python ...

  7. qq2440启动linux后插入u盘出现usb 1-1: device descriptor read/64, error -110,usb 1-1: device not accepting address 8, error -110

    上位机:ubuntu14.04 64bit 下位机:qq2440 交叉编译器:arm-linux-gcc 3.4.1 下位机使用的linux内核版本:kernel2.6.13 1.插入u盘时错误信息如 ...

  8. Educational Codeforces Round 6 E. New Year Tree dfs+线段树

    题目链接:http://codeforces.com/contest/620/problem/E E. New Year Tree time limit per test 3 seconds memo ...

  9. android中的HttpURLConnection和HttpClient实现app与pc数据交互

    自学android的这几天很辛苦,但是很满足,因为每当学到一点点知识点都会觉得很开心,觉得今天是特别有意义的,可能这个就是一种莫名的热爱吧. 下面来说说今天学习的HttpURLConnection和H ...

  10. Gradle build设置自动log开关

    应用场景 通常情况下我们的apps发布后也就是release模式下log是不显示的,debug模式下是显示log的,但是在特殊情况下我们测试release包的时候需要log的时候,就无法使用Build ...