二叉树的深度与二叉平衡树判断

我的代码:直接用了以前那个求二叉树某一个条路径的和为特定值的思想
  1. struct TreeNode{
  2. int val;
  3. struct TreeNode *left;
  4. struct TreeNode *right;
  5. };
  1. #ifndef BINARY_TREE_DEEP_H
  2. #define BINARY_TREE_DEEP_H
  3. #include "reconstructBinaryTree.h"
  4. #include<stack>
  5. #include<set>
  6. void treeDeepCore(TreeNode *node ,std::stack<TreeNode*> &v_stack,std::set<int> &v_set);
  7. int getBinaryTreeDeep(TreeNode **root){
  8. if(root==NULL||*root==NULL){
  9. return 0;
  10. }
  11. std::stack<TreeNode*> g_stack;
  12. std::set<int> g_set;
  13. treeDeepCore(*root,g_stack,g_set);
  14. std::cout<<*(g_set.begin())<<std::endl;
  15. return *(g_set.rbegin());
  16. }
  17. void treeDeepCore(TreeNode *node ,std::stack<TreeNode*> &v_stack,std::set<int> &v_set){
  18. if(node==NULL){
  19. return;
  20. }
  21. v_stack.push(node);
  22. if(node->left==NULL&&node->right==NULL){
  23. v_set.insert(v_stack.size());
  24. }
  25. treeDeepCore(node->left,v_stack,v_set);
  26. treeDeepCore(node->right,v_stack,v_set);
  27. if(!v_stack.empty()){
  28. v_stack.pop();
  29. }
  30. }
  31. #endif
  1. #include"binaryTreeDeep.h"
  2. int main(){
  3. int pre[8]={1,2,4,7,3,5,6,8};
  4. int mid[8]={4,7,2,1,5,3,8,6};
  5. struct TreeNode *root=reconstructBinaryTree(pre,mid,8); //重建二叉树
  6. std::cout<<getBinaryTreeDeep(&root);
  7. }

如上图中,求棵树的深度我们其实可以这样,无非就是求最大路径的长度嘛,用递归的思想就可以解决这个问题了。
你看最大深度无非就是以下几种情况:
左子树为空,右子树不为空:深度为左子树的深度加1嘛
左子树不为空,右子树为空:深度为右子树的深度加1嘛
左右子树都不为空:               深度为两者中最大的深度为1嘛

  1. int binaryTreeDeepCore(TreeNode *node){
  2. if(node==NULL){
  3. return 0;
  4. }
  5. int leftDeep=binaryTreeDeepCore(node->left);
  6. int rightDeep=binaryTreeDeepCore(node->right);
  7. return (leftDeep>rightDeep)? (leftDeep+1):(rightDeep+1);
  8. }
在这个基础上判断一棵树是不是平衡二叉树,于是知,也就是看一棵树是否存在两个左右节点深度差大于1嘛。
  1. #ifndef IS_BALANCETREE_H
  2. #define IS_BALANCETREE_H
  3. #include"reconstructBinaryTree.h"
  4. int binaryTreeDeepCore(TreeNode *node);
  5. bool isBalanceBT(TreeNode *root){
  6. if(root==NULL){
  7. return true;
  8. }
  9. int leftDeep=binaryTreeDeepCore(root->left);
  10. int rightDeep=binaryTreeDeepCore(root->right);
  11. int diffDeep=leftDeep-rightDeep;
  12. if(diffDeep>1||diffDeep<-1)
  13. return false;
  14. return binaryTreeDeepCore(root->left)&&binaryTreeDeepCore(root->right);
  15. }
  16. int binaryTreeDeepCore(TreeNode *node){
  17. if(node==NULL){
  18. return 0;
  19. }
  20. int leftDeep=binaryTreeDeepCore(node->left);
  21. int rightDeep=binaryTreeDeepCore(node->right);
  22. return (leftDeep>rightDeep)? (leftDeep+1):(rightDeep+1);
  23. }
  24. #endif






posted @ 2015-07-17 19:23  yml435  阅读(290)  评论(0编辑  收藏  举报