程序员面试题精选100题(60)-判断二叉树是不是平衡
2013-01-14 16:58
375 查看
// 程序员面试题精选100题(60)-判断二叉树是不是平衡.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; struct TNode{ char chValue; TNode *leftChild; TNode *rightChild; }; TNode* rebuildTree(char *preOrder,int start1,char *midOrder,int start2,int n)//根据前序和中序建立二叉树 长度为N { TNode *root; if(n==0) return NULL; root = new TNode; int pivet; char chroot; chroot=preOrder[start1]; root->chValue = chroot; for(int i=start2;i<start2+n;i++)//include start1 { if(midOrder[i]==chroot) { pivet = i;break;} } if(pivet-start2>0) root->leftChild=rebuildTree(preOrder,start1+1,midOrder,start2,pivet-start2); else root->leftChild = NULL; if(n-pivet+start2-1>0)//pivet-start2 is the half number, root->rightChild=rebuildTree(preOrder,start1+1+pivet-start2,midOrder,pivet+1,n-pivet+start2-1); else root->rightChild = NULL; return root; } void preprint(TNode *root) { if(root!=NULL) { cout<<root->chValue<<" "; preprint(root->leftChild); preprint(root->rightChild); } } int flag=1; int isbalance(TNode *root) { if (flag==0) { return -1; } if (root==NULL) { return 0; } int h1=isbalance(root->leftChild)+1; int h2=isbalance(root->rightChild)+1; if (abs(h1-h2)>1) { flag=0; } return h1>h2?h1:h2; } ////////////////////////////////////////////////////////////////////////// bool IsBalanced(TNode* pRoot, int* pDepth) { if(pRoot == NULL) { *pDepth = 0; return true; } int left, right; if(IsBalanced(pRoot->leftChild, &left) && IsBalanced(pRoot->rightChild, &right)) { int diff = left - right; if(diff <= 1 && diff >= -1) { *pDepth = 1 + (left > right ? left : right); return true; } } return false; } bool IsBalanced(TNode* pRoot) { int depth = 0; return IsBalanced(pRoot, &depth); } int _tmain(int argc, _TCHAR* argv[]) { TNode* rootparent,*rootchild; int n,m; cout<<"input n"<<endl; cin>>n; char *preOrder=new char ; char *midOrder=new char ; cout<<"input preorder1"<<endl; for(int i=0;i<n;i++) cin>>preOrder[i]; cout<<"input midorder1"<<endl; for(int i=0;i<n;i++) cin>>midOrder[i]; rootparent=rebuildTree(preOrder,0,midOrder,0,n); preprint(rootparent); cout<<endl; isbalance(rootparent); if (flag==1) { cout<<"is balance "<<endl; } else { cout<<"is not balance "<<endl; } cout<<IsBalanced(rootparent); system("pause"); return 0; }自己的程序好像不是很规范,或说不专业
相关文章推荐
- 程序员面试题精选100题(60)-判断二叉树是不是平衡
- 程序员面试题精选100题(60)-判断二叉树是不是平衡的
- 程序员面试题精选100题(60)-判断二叉树是不是平衡的
- 程序员面试题精选100题(60)-判断二叉树是不是平衡的
- 程序员面试题精选100题(60)-判断二叉树是不是平衡[数据结构]
- 程序员面试题精选-- 判断二叉树是不是平衡的
- 程序员面试题精选100题(60)-判断二叉树是不是平衡[数据结构]
- 程序员面试题精选100题(06)-判断整数序列是不是二元查找树的后序遍历结果
- 程序员面试题精选100题(06)-判断整数序列是不是二元查找树的后序遍历结果
- [程序员面试题精选100题]12.从上往下遍历二叉树
- 程序员面试题精选100题(48)-二叉树两个结点的最低共同父结点
- 程序员面试题精选100题(48)-二叉树两结点的最低共同父结点
- 程序员面试题精选--06 判断整数序列是不是二元查找树的后序遍历结果
- 面试题39:二叉树的深度、判断二叉树是不是平衡
- [程序员面试题精选100题]4.二叉树中和为某一值的所有路径
- 程序员面试题精选100题(48)-二叉树两结点的最低共同父结点
- 程序员面试题精选100题(21)-左旋转字符串[算法]
- 判断二叉树是不是平衡
- 程序员面试题精选100题(46)-对称子字符串的最大长度[算法]
- 程序员面试题精选100题(18)-用两个栈实现队列[数据结构]