问题描述:

打印所有到叶子节点长度为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. 十八、Java基础--------IO流体系以及字符流

    在上一章节中详细介绍集合框架的相关知识,在接下来的几篇文章中将讲述Java中另一个及其重要的知识——IO流,本文主要是讲述IO流的一些基本概念以及字符流的相关应用. IO流 介绍IO流之前先介绍一下什 ...

  2. Upload file

    <h3>Upload File</h3> <form action="@Url.Action("Upload","UploadCo ...

  3. MySQL functions, IF, CASE

    MySQLTutorial官网 IF function syntax: IF(expr,if_true_expr,if_false_expr) CASE expression syntax: CASE ...

  4. Linux之常用快捷键

    tab:自动补齐命令或者路径 ESC+u:将字符小写变大写 ctrl+s:在终端中冻结stdin ctrl+q:在终端中恢复stdin ctrl+a:光标移动到行首 ctrl+e:光标移动到行尾 ct ...

  5. SC.UI

    IController using Microsoft.Practices.Prism.Events; using Microsoft.Practices.Prism.Regions; using M ...

  6. js关于函数调用

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 2016年江西理工大学C语言程序设计竞赛(高级组)

    问题 A: jxust 解法:争议的问题(是输入整行还是输入字符串),这里倾向输入字符串,然后判断是否含有jxust就行 #include<bits/stdc++.h> using nam ...

  8. Android自定义View (二) 进阶

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24300125 继续自定义View之旅,前面已经介绍过一个自定义View的基础的例 ...

  9. minicom 使用教程

    因为现在电脑基本不配备串行接口,所以,usb转串口成为硬件调试时的必然选择.目前知道的,PL2303的驱动是有的,在dev下的名称是ttyUSB#. minicom,tkterm都是linux下应用比 ...

  10. parseInt的源码阅读

    parseInt的源码阅读 Integer.parseInt()这个方法的功能小巧又实用,实现起来困难不大,没有很复杂.这里就来看一下Java的源码是怎么写的吧,走一边大婶写过的代码,应该会有点收获吧 ...