二叉树中和为某一值的路径(面试题 25)

来源:互联网 发布:shell编程入门书籍推荐 编辑:程序博客网 时间:2024/05/22 11:21

题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶节点所经过的结点形成一条路径。(一道好题!)

#include "stdlib.h"#include "iostream"#include "stack"#include "queue"using namespace std;typedef int KeyType;typedef struct Node {KeyType key;struct Node* left;struct Node* right;struct Node* parent;}Node,*pNode;void insert(pNode* root,KeyType key){//初始化插入结点pNode p =(pNode)malloc(sizeof(Node));p->key =key;p->left =p->right =p->parent =NULL;if((*root)==NULL){*root =p;return;}//插入到当前结点(*root)的左孩子if ((*root)->left ==NULL&&(*root)->key>key){p->parent =(*root);(*root)->left =p;return;}if ((*root)->right ==NULL&&(*root)->key<key){p->parent =(*root);(*root)->right =p;return;}if ((*root)->key>key){insert(&(*root)->left,key);}else if((*root)->key<key)insert(&(*root)->right,key);elsereturn;}void create(pNode* root,KeyType *keyArray,int length){int i;//逐个结点插入二叉树for (i=0;i<length;i++){insert(root,keyArray[i]);}}void print(pNode root){queue<pNode>  queue1;pNode p;if (root){queue1.push(root);}while(!queue1.empty()){p =queue1.front();cout<<p->key<<" "<<endl;if (p->left){queue1.push(p->left);}if (p->right){queue1.push(p->right);}queue1.pop();}}void FindPath(pNode pRoot,int expectedSum,std::vector<int>& path,int currentSum){currentSum +=pRoot->key;path.push_back(pRoot->key);//如果是叶节点,并且路径上结点的和等于输入的值bool isLeaf =pRoot->left ==NULL&&pRoot->right ==NULL;if (currentSum ==expectedSum&&isLeaf){cout<<"A path is found: ";std::vector<int>::iterator iter =path.begin();for (;iter!=path.end();++iter){cout<<*iter<<"\t";}cout<<endl;}//如果不是叶节点,则遍历它的子节点if (pRoot->left !=NULL){FindPath(pRoot->left,expectedSum,path,currentSum);}if (pRoot->right !=NULL){FindPath(pRoot->right,expectedSum,path,currentSum);}path.pop_back();}void FindPath(pNode pRoot,int expectedSum){if (pRoot ==NULL){return;}std::vector<int> path;int currentSum =0;FindPath(pRoot,expectedSum,path,currentSum);}int main(){int i;//注意这种传参数的方式,以root地址作为参数,返回根节点的指针pNode root =NULL;KeyType nodeArray[11] ={15,6,18,3,7,17,20,2,4,13,9};create(&root,nodeArray,11);//inorderTraver(root);//print(root);FindPath(root,26);printf("\n");}


0 0
原创粉丝点击