一、判断一棵树是否平衡二叉树(AVL)
1.1 思路
条件:对当前结点
- 左子树是否平衡?不平衡就return false,无需后续判断
- 右子树是否平衡?不平衡就return false,无需后续判断
- 左子树右子树均平衡时,左子树的高度是多少?
- 左子树右子树均平衡时,右子树的高度是多少? 获得高度差
把这些条件一写,即可得到一个递归函数,用-1去标识树不平衡,而如果平衡,会返回准确的高度
1.2 测试结果及代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <string>
#include <queue>
#include <math.h>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
int process(TreeNode *head) {
if (head == NULL)
return 0;
int h1 = process(head->left);
if (h1 == -1)
return -1;
int h2 = process(head->right);
if (h2 == -1)
return -1;
if (abs(h1 - h2) > 1)
return -1;
return max(h1, h2) + 1;
}
bool isBalanced(TreeNode* root) {
if (root == NULL)
return true;
int res = process(root);
if (res == -1) {
cout << "此树不平衡!\n";
return false;
}
cout << "此树平衡,树高为:" << res;
return true;
}
};
int main(int argc, char* argv[]){
TreeNode *head = new TreeNode(1);
head->left = new TreeNode(2);
//head->right = new TreeNode(3);
//head->left->right = new TreeNode(5);
head->left->left = new TreeNode(6);
Solution s;
s.isBalanced(head);
return 0;
}
二、判断一棵树是否二叉搜索树(BST)
2.1 思路
把非递归中序遍历时的打印时机改为跟前一个数作判断,看它是否比前一个数大即可。
需要用一个变量pre来保存前一个数,如果出现了比前一个数小,那么返回false
2.2 测试结果及代码
#include <iostream>
#include <algorithm>
#include <vector>