2015暑期实习生招聘阿里一面面试题之如何判判树是否为二叉搜索树 如何利用前序中序建二叉树

来源:互联网 发布:模仿声音软件下载 编辑:程序博客网 时间:2024/06/05 08:35

        判断树是否为二叉搜索树,主要利用搜索树的中序遍历是递增的这一性质  

#include <iostream>#include <vector>using namespace std;//建树以及判断是不是二叉树//根据前序和中序 建树 struct treeNode{   int value;   treeNode* left;   treeNode*right; };//vector<int> ivec;void PrintfTreeInOrder(treeNode*head){    if(head!=NULL)     {          PrintfTreeInOrder(head->left);     cout<<head->value<<" ";     PrintfTreeInOrder(head->right);     }        // ivec.push_back(head->value);}treeNode* buildTreeCore(int *inOrderStart,int*inOrderEnd,int*preOrderStart,int *preOrderEnd){  int  length=preOrderEnd-preOrderStart+1; treeNode* root=new treeNode;     root->value=preOrderStart[0];     root->left=root->right=NULL;if(length==1){if(inOrderStart[0]==preOrderStart[0])               return root;    else    ;    //throw std::exception"error";本来是想抛出异常的 结果throw 还不会用!}       int rootValue=preOrderStart[0];      int *rootInOrder=inOrderStart;while(rootInOrder<=inOrderEnd&&*rootInOrder!=rootValue)    {      rootInOrder++;}     //改制此处!     if(*rootInOrder!=rootValue)    ;// throw std::exception("error input"); int leftLength=rootInOrder-inOrderStart; root->left=buildTreeCore(inOrderStart,rootInOrder-1,preOrderStart+1,preOrderStart+leftLength);root->right=buildTreeCore(rootInOrder+1,inOrderEnd,preOrderStart+leftLength+1,preOrderEnd);    return root;}treeNode* bulidTree(int *preOrder,int* inOrder,int length) {if(preOrder==NULL||inOrder==NULL||length<=0)    return NULL;    return buildTreeCore(inOrder,inOrder+length-1,preOrder,preOrder+length-1);}int main(){int inOrder[7]={4,8,9,12,13,15,16};int preOrder[7]={12,8,4,9,15,13,16};treeNode*root=bulidTree(preOrder,inOrder,7);PrintfTreeInOrder(root);}

实际面试题是:如何判断是否为二叉树,本文引申了如何利用前序中序建树的方法

0 0
原创粉丝点击