本博客内容:
- 判断一棵二叉树是否是平衡二叉树
- 判断一棵树是否是搜索二叉树
- 判断一棵树是否是完全二叉树
- 已知一棵完全二叉树,求其节点的个数
判断一棵二叉树是否是平衡二叉树
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; }
参考
牛客网左程云算法