微软面试之4 在二元树中找出和为某一值的所有路径(树)

来源:互联网 发布:97天龙八部gotv源码 编辑:程序博客网 时间:2024/05/18 00:52

4 题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树
    10  
  /   /   
 5    12   
/ \     
4  7
则打印出两条路径:10, 12和10, 5, 7。



#include <iostream>

using namespace std;

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

struct Stack {
    int data[100];
    int top;
};


void addNode(BSTreeNode * & root ,int value) {
    if(root==NULL) {
        BSTreeNode * p = new BSTreeNode;
        p->value = value;
        p->right = NULL;
        p->left = NULL;
        root  = p;
    }
    if(value > root->value) {
        addNode(root->right,value);
    }
    if(value< root->value) {
        addNode(root->left,value);
    }
}

void allPath(BSTreeNode * root ,int  n,Stack ss) {
    int m;
    m = n-(root->value);

    ss.data[ss.top] = root->value;
    ss.top++;

    if((n==root->value) && (root->left==NULL) && (root->right==NULL)){
        cout<<root->value<<endl;
        for(int j=0;j<ss.top;j++) {
            cout<<ss.data[j]<<"  ";
        }
        cout<<endl;
    }
    else {

        Stack s;
        s.top = ss.top;
        for(int i=0; i<ss.top;i++) {
            s.data[i] = ss.data[i];
        }

        if(root->left != NULL) {
            
            allPath(root->left,m,s);
            
        }
        if(root->right != NULL) {
            allPath(root->right,m,s);
        }
    }
}

int main() {
    BSTreeNode * root = NULL;
    Stack ss;
    ss.top = 0;
    addNode(root,10);
    addNode(root,6);
    addNode(root,11);
    addNode(root,12);
    addNode(root,4);
    addNode(root,9);
    addNode(root,8);
    allPath(root,33,ss);
}

原创粉丝点击