【Tree】判断平衡二叉树AVL

  1 /***********************************
  2 https://leetcode.com/problems/balanced-binary-tree/
  3 @date 2015.5.8
  4 @description
  5 给定一个二叉树,判断是否是平衡二叉树
  6 @tags tree, DFS
  7 
  8 平衡二叉树满足的条件:
  9 1.左右子树的高度差不大于1
 10 2.左右子树均是平衡二叉树
 11 
 12 本次解决方案提供了两种方法:
 13 Solution1.
 14 递归先分别算出左右子树的高度,再做差与1比较,如果≤1,则再判断左右子树是否为AVL
 15 
 16 Solution2.
 17 计算并返回左右子树的高度,同时可以判断左右子树是否为AVL树,
 18 这样就不需要在判断左右字数高度差不大于1之后再回去判断左右子树是否为AVL树
 19 
 20 测试函数中增加了搜索二叉树的创建 和 递归先序遍历二叉树
 21 
 22 
 23 ************************************/
 24 
 25 
 26 #include <iostream>
 27 #include <stdlib.h>
 28 
 29 using namespace std;
 30 
 31 struct TreeNode{
 32     int val;
 33     TreeNode *left;
 34     TreeNode *right;
 35     TreeNode(int x) : val(x), left(NULL), right(NULL){}
 36 };
 37 
 38 
 39 class Solution{
 40 public:
 41     bool isBalanced(TreeNode *root){
 42         // 递归
 43         if (!root) return true; // 空树也是AVL
 44         int depthLeft = maxDepth(root->left);
 45         int depthRight = maxDepth(root->right); // 算左右子树的最大深度,即为树的高度
 46         if (abs(depthLeft - depthRight) <= 1) // 左右子树的高度差不超过1,条件之一
 47             return isBalanced(root->left) && isBalanced(root->right); // 左右子树都是AVL,条件二
 48         else
 49             return false;
 50     }
 51 
 52     int maxDepth(TreeNode *root){
 53         if (!root) return 0;
 54         return 1 + max(maxDepth(root->left), maxDepth(root->right));
 55     }
 56 
 57 };
 58 
 59 
 60 class Solution2{
 61 public:
 62     bool isBalanced(TreeNode *root){
 63         return dfsDepth(root) != -1;
 64     }
 65 
 66     int dfsDepth(TreeNode *root){
 67         if (!root) return 0;
 68         int leftDepth = dfsDepth(root->left);
 69         if (leftDepth == -1) return -1;
 70         int rightDepth = dfsDepth(root->right);
 71         if (rightDepth == -1) return -1;
 72 
 73         if (abs(leftDepth - rightDepth) > 1)
 74             return -1;
 75         return max(leftDepth, rightDepth) + 1;
 76     }
 77 };
 78 
 79 TreeNode *insert(TreeNode *root, int data){
 80     TreeNode *ptr = root;
 81     TreeNode *tempNode; // 存储的是插入节点的父节点
 82     TreeNode *newNode = new TreeNode(data);
 83 
 84     if (ptr == NULL)
 85         return newNode;
 86     else{
 87         while (ptr != NULL){
 88             tempNode = ptr;
 89             if (ptr->val >= data){
 90                 ptr = ptr->left;
 91             }else{
 92                 ptr = ptr->right;
 93             }
 94         }
 95         if (tempNode->val >= data){
 96             tempNode->left = newNode;
 97         }else{
 98             tempNode->right = newNode;
 99         }
100     }
101     return root;
102 }
103 
104 // 递归先序遍历二叉树
105 void travPre(TreeNode *root){
106     if (!root) return;
107     cout << root->val << " ";
108     travPre(root->left);
109     travPre(root->right);
110 }
111 
112 
113 int main(){
114     TreeNode *root = NULL;
115     int temp = 0;
116     cin >> temp;
117     while (temp != 0){ // 以0结尾(输入0终止)
118         root = insert(root, temp);
119         cin >> temp;
120     } // 创建一棵二叉树
121 
122     // 递归先序遍历
123     travPre(root);
124 
125     cout << endl;
126     Solution2 a;
127     cout << a.isBalanced(root);
128 }

 

posted @ 2015-05-12 08:55  LizSep  阅读(384)  评论(0编辑  收藏  举报