算法题C++(五)

本博客内容:

  • 判断一棵二叉树是否是平衡二叉树
  • 判断一棵树是否是搜索二叉树
  • 判断一棵树是否是完全二叉树
  • 已知一棵完全二叉树,求其节点的个数

判断一棵二叉树是否是平衡二叉树

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;
}

参考

牛客网左程云算法

猜你喜欢

转载自blog.csdn.net/weixin_39953502/article/details/80234716