本博客内容:
- 判断一棵二叉树是否是平衡二叉树
- 判断一棵树是否是搜索二叉树
- 判断一棵树是否是完全二叉树
- 已知一棵完全二叉树,求其节点的个数
判断一棵二叉树是否是平衡二叉树
bool isBalance1(TreeNode* root) {
if (root == NULL) {
return true;
}
return abs(getHeight1(root->left) - getHeight1(root->right) < 1) && isBalance1(root->left)
&& isBalance1(root->right);
}
int getHeight1(TreeNode* node) {
if (node == NULL) {
return 0;
}
int height = 1 + max(getHeight1(node->left), getHeight1(node->right));
return height;
}
bool isBalance2(TreeNode* root) {
int depth = 0;
return getHeight2(root, depth);
}
bool getHeight2(TreeNode* node, int& depth) {
if (node == NULL) {
return true;
}
int left = 0;
int right = 0;
if (getHight2(node->left, left) && getHeight2(node->right, right)) {
if (abs(left - right) <= 1) {
depth = (left > right ? left : right) + 1;
return true;
}
else{
return false;
}
}
return false;
}
判断一棵树是否是搜索二叉树
//搜索二叉数的中序遍历就应该是从小到大次序排列
bool isBST(TreeNode* head) {
if (head == NULL) {
return true;
}
stack<TreeNode*> tmp;
int pre = INT_MIN;
while (head != NULL || !tmp.empty()) {
if (head != NULL) {
tmp.push(head);
head = head->left;
}
else {
head = tmp.top();
tmp.pop();
if (pre > head->val) {
return false;
}
else {
pre = head->val;
}
head = head->right;
}
}
return true;
}
判断一棵树是否是完全二叉树
bool isCBT(TreeNode* head) {
if (head == NULL) {
return true;
}
queue<TreeNode*> tmp;
bool isLeaf = false;
tmp.push(head);
TreeNode* left = NULL;
TreeNode* right = NULL;
while (!tmp.empty()) {
head = tmp.top();
tmp.pop();
left = head->left;
right = head->right;
if ((isLeaf && (left != NULL || right != NULL)) || (left == NULL && right != NULL)) {
return false;
}
if (left != NULL) {
tmp.push(left);
}
if (right != NULL) {
tmp.push(right);
}
if(left == NULL && right == NULL) {
isLeaf = true;
}
}
return true;
}
已知一棵完全二叉树,求其节点的个数
int CBTN(TreeNode* root) {
if (root == NULL) {
return 0;
}
return nodeNum(root, 1, mostLeft(root, 1));
}
int nodeNum(TreeNode* root, int level, int h) {
if (level == h) {
return 1;
}
if (mostLeft(root->right, level + 1)== h) {
return (1 << (h - 1)) + nodeNum(root->right, level + 1, h);
}
else {
return (1 << (h - 2)) + nodeNum(root->left, level + 1, h);
}
}
int mostLeft(TreeNode* node, int level) {
while (node != NULL) {
level++;
node = node->left;
}
return level - 1;
}
参考
牛客网左程云算法