1. 程式人生 > >二叉樹數據結構和算法

二叉樹數據結構和算法

span reat 排序 算法 eof 打印路徑 所有結點 數據 oot

參考:http://blog.csdn.net/dazhong159/article/details/7906916

百度面試題目:

        輸入一個整數和一棵二元樹。從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。打印出和與輸入整數相等的所有路徑。
        例如輸入整數 22 ,如下圖二元樹:
                                            10
                                           /                                               5     12
/ \ 4 7 則打印出兩條路徑:10, 12和10, 5, 7。 #include <stdafx.h> #include<stdlib.h> #define MAX 20 struct BiTreeNode { int data; struct BiTreeNode *left; struct BiTreeNode *right; };
/*遞歸創建二叉排序樹,以‘-1‘結束*/ BiTreeNode * CreateBSTree(int *data,int pos,int len) { BiTreeNode * tr; if(pos>=len) { return NULL; } else { tr = (BiTreeNode *)malloc(sizeof(BiTreeNode)); tr->data=data[pos]; tr->left = CreateBSTree(data,2
*pos+1,len); tr->right = CreateBSTree(data,2*pos+2,len); return tr; } } //中序遍歷二叉樹 void InOrderTraverse(BiTreeNode * root) { if(root!=NULL) { InOrderTraverse(root->left); printf("%d ",root->data); InOrderTraverse(root->right); } } //打印路徑 void printPath(int path[],int top) { printf("第一組:"); for(int i=0;i<top;i++) printf("%d ",path[i]); printf("\n"); } //查找和為sum的路徑,path數組存放路徑的值,top代表每個可行的路徑中的元素個數 void findPath(BiTreeNode *root, int sum,int top,int path[]) { path[top++] = root->data; sum -= root->data; if (root->left == NULL && root->right==NULL) { if (sum == 0) { printPath(path, top); } } else { if (root->left != NULL) findPath(root->left, sum, top,path); if (root->right!=NULL) findPath(root->right, sum, top,path); } top --; sum += root->data; } int main() { int data[]={1,2,3,1,2,3,2,1,3,2,1,2,1,2,1}; int len=sizeof(data)/sizeof(int); BiTreeNode * root=CreateBSTree(data,0,len); InOrderTraverse(root); printf("\n"); int sum=6; int top=0; int path[MAX]={0}; findPath(root,sum,top,path); return 0; }

二叉樹數據結構和算法