Company TengX 面试 笔试 : 打印 二叉树 指定值的所有路径

139 篇文章 2 订阅
25 篇文章 0 订阅
/* 
 * File:   打印二叉树指定值的所有路径.cpp
 * Author: hongbin
 *
 */


#include <cstdlib>
#include <iostream>
using namespace std;


/*
 * 
 */
typedef struct treenode {
int value;
struct treenode* left;
struct treenode* right;  
 treenode(int data=0){
  value=data;
  left=right=NULL;    
 }
 
} Treenode;


Treenode* CreateTree(void){
    
 Treenode* root=new Treenode(2);
  
 Treenode* ptr=new Treenode(3);
  root->left=ptr;
  
  ptr=new Treenode(4);
  root->right=ptr;
  
  ptr=new Treenode(5);
   root->left->left=ptr;
    ptr=new Treenode(6);
   root->left->right=ptr;
  
   ptr=new Treenode(7);
   root->right->left=ptr;
    ptr=new Treenode(8);
   root->right->right=ptr;
   
    ptr=new Treenode(9);
   root->left->left->left=ptr;
    ptr=new Treenode(10);
    root->left->left->right=ptr;
   
 return root;  
}


int GetDepth(Treenode* root){
   if(NULL==root)
     return 0; 
   int leftdepth,rightdepeth,finaldepth;
   leftdepth=GetDepth(root->left);
   rightdepeth=GetDepth(root->right);
   finaldepth=leftdepth>rightdepeth? (leftdepth+1):(rightdepeth+1);
   return finaldepth;
}


void PrintNodeList(int *node_array,int start, int end){
 if(NULL==node_array)   
     return;
 cout<<"matched node list: "<<endl;
 for(int index=start; index<=end; index++){
     cout<<" "<<node_array[index];
  }  
 cout<<""<<endl;
}
// level = the depth's th of the tree
// node_array saves the node list from root to this current_node
//sum = value of the given sum
void FindSum(Treenode* current_node, int sum, int node_array[], int level){
 if(NULL==current_node)
     return;
 
 node_array[level]=current_node->value;
 int tempvalue=0;
 
 for(int i=level;i>=0;i--) {
   tempvalue+=node_array[i];
   if(tempvalue==sum) {
       cout<<"find match value="<<tempvalue<<endl;
       //print matched nodes list.
       PrintNodeList(node_array,i,level);
   }
  }
 FindSum(current_node->left,sum,node_array,level+1);
 FindSum(current_node->right,sum,node_array,level+1);
 //shall make node_array[level] invalid
 return;
}


void FindSum(Treenode* root, int sum ){
 if(NULL==root)
     return;
 int depth=GetDepth(root);
 int *node_array=new int[depth];
 
 cout<<"tree depth="<<depth<<endl;
 FindSum(root,sum,node_array,0);
}




int main(int argc, char** argv){
    int sum=0;
    Treenode* head=CreateTree();
    cout<<"input value=";
    cin>>sum;
    FindSum(head,sum);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值