【微軟面試一百題:4】在二元樹中找出和為某一值的所有路徑

weixin_34075551發表於2015-05-29

題目:輸入一個整數和一棵二元樹。 從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。 列印出和與輸入整數相等的所有路徑。
例如輸入整數 22 和如下二元樹
10
/
5 12
/ \
4 7
則列印出兩條路徑:10, 12 和 10, 5, 7

hint: 藉助 陣列 模擬 Stack
#include <iostream>
#include <string>
using namespace std;

struct BSTreeNode
{
    int value;
    BSTreeNode *left;
    BSTreeNode *right;
};

void AddBSTreeNode(BSTreeNode * &pCurrent,int value){
    if (NULL==pCurrent) {
        BSTreeNode * newNode = new BSTreeNode;
        newNode->left=NULL;
        newNode->right=NULL;
        newNode->value = value;
        pCurrent = newNode;
    }else{
        if (pCurrent->value>value) {
            AddBSTreeNode(pCurrent->left, value);
        }else if (pCurrent->value<value)
            AddBSTreeNode(pCurrent->right, value);
        
    }
}
void printPath(int path[],int size){
    for (int i=0; i<size ; i++) {
        cout<<path[i]<<endl;
    }
    cout<<endl;
}

void printRoute(BSTreeNode *root,int sum,int path[],int top){
    path[top++]=root->value;
    sum-=root->value;
    if (root->left==NULL&&root->right==NULL) {
        if (sum==0) {
            printPath(path,top);
        }
    }else{
        if (root->left!=NULL)
            printRoute(root->left, sum, path, top);
        if (root->right!=NULL)
            printRoute(root->right, sum, path, top);
    }
    top--;
    sum+=root->value;
}
int main()
{
    BSTreeNode * root = NULL;
    
    AddBSTreeNode(root, 10);
    AddBSTreeNode(root, 5);
    AddBSTreeNode(root, 4);
    AddBSTreeNode(root, 7);
    AddBSTreeNode(root, 12);
 
    
    int path[100];
    printRoute(root, 22, path, 0);
    return 0;
}

相關文章