问题描述:

打印所有到叶子节点长度为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. 关于Beta分布、二项分布与Dirichlet分布、多项分布的关系

    在机器学习领域中,概率模型是一个常用的利器.用它来对问题进行建模,有几点好处:1)当给定参数分布的假设空间后,可以通过很严格的数学推导,得到模型的似然分布,这样模型可以有很好的概率解释:2)可以利用现 ...

  2. 【数论】二进制GCD

    二进制GCD     GCD这种通用的算法相信每个OLER都会 ,辗转相除,代码只有四行 : int GCD(int a,int b){ if(b==0) return a; return GCD(b ...

  3. HttpClient请求返回JSON、图片

    /** * Created by RongGuang on 2015/9/19. */ public class RongHttp { /** * Http Post请求 * @param url * ...

  4. win32 公用对话框

    ## 公用对话框 ## 公用对话框:打开文件.保存文件.选择字体.选择颜色.查找.查找替换... 等等.(我就用过这几个其他的可以猜测用法,给出部分代码,这里我就不一一贴代码了,用到了在完善吧) 用到 ...

  5. UltraISO向U盘写入镜像特别慢

    电脑:Dell INSPIRON 1416 系统:WIN7旗舰版32位 U盘:金士顿8G 镜像:CentOS7 ×86_64 问题: 开始使用"写入"功能,写入速度72k/s 后来 ...

  6. [课程设计]Scrum 1.6 多鱼点餐系统开发进度(点餐页面按钮添加&修复)

    [课程设计]Scrum 1.6 多鱼点餐系统开发进度(点餐页面按钮添加&修复) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4. ...

  7. 添加一个DataSet

    /// <summary> /// 返回状态数据 /// </summary> /// <param name="values"></pa ...

  8. 在FireFox中安装Selenium IDE

    第二步:点击查看更多,查找Selenium IDE,安装 第三步:安装好后,在顶部的工具栏里点击"工具",弹出的选项框里出现Selenium IDE,安装完毕.

  9. CentOS的网络配置(终端环境)

    在虚拟机中安装了Server版的CentOS,用于做Hadoop相关的实验.Server版的CentOS默认是没有桌面环境的,eth0的网络默认也没有开启,需要我们手动启动网络. 关键配置说明 网络和 ...

  10. Arduino学习笔记二:修改LED点灯程序

    看了开源社区的LED控制程序,开始上手代码编写,修改,下载以及调试,原文地址:http://www.arduino.cn/thread-1072-1-1.html,这个帖子写的比较通俗易懂. 自己移植 ...