二叉树操作模板

作者: qiqi 分类: 数据结构 发布时间: 2026-05-24 20:40
#include <bits/stdc++.h>
using namespace std;

struct TreeNode
{
	int val;
	TreeNode *left, *right;
	TreeNode(int x = 0) : val(x), left(nullptr), right(nullptr) {}
};

// 基本操作
int countNodes(TreeNode *root)
{
	return root ? 1 + countNodes(root->left) + countNodes(root->right) : 0;
}

int maxDepth(TreeNode *root)
{
	return root ? 1 + max(maxDepth(root->left), maxDepth(root->right)) : 0;
}

int countLeaves(TreeNode *root)
{
	if (!root)
		return 0;
	if (!root->left && !root->right)
		return 1;
	return countLeaves(root->left) + countLeaves(root->right);
}

TreeNode *invertTree(TreeNode *root)
{
	if (!root)
		return nullptr;
	swap(root->left, root->right);
	invertTree(root->left);
	invertTree(root->right);
	return root;
}

// 遍历
void preorder(TreeNode *root)
{
	if (!root)
		return;
	cout << root->val << " ";
	preorder(root->left);
	preorder(root->right);
}

void inorder(TreeNode *root)
{
	if (!root)
		return;
	inorder(root->left);
	cout << root->val << " ";
	inorder(root->right);
}

void postorder(TreeNode *root)
{
	if (!root)
		return;
	postorder(root->left);
	postorder(root->right);
	cout << root->val << " ";
}

void levelorder(TreeNode *root)
{
	if (!root)
		return;
	queue<TreeNode *> q;
	q.push(root);
	while (!q.empty())
	{
		TreeNode *u = q.front();
		q.pop();
		cout << u->val << " ";
		if (u->left)
			q.push(u->left);
		if (u->right)
			q.push(u->right);
	}
}

// 二叉搜索树
TreeNode *searchBST(TreeNode *root, int target)
{
	while (root && root->val != target)
		root = (target < root->val) ? root->left : root->right;
	return root;
}

TreeNode *insertBST(TreeNode *root, int val)
{
	if (!root)
		return new TreeNode(val);
	if (val < root->val)
		root->left = insertBST(root->left, val);
	else
		root->right = insertBST(root->right, val);
	return root;
}

TreeNode *findMin(TreeNode *root)
{
	while (root->left)
		root = root->left;
	return root;
}

TreeNode *deleteBST(TreeNode *root, int key)
{
	if (!root)
		return nullptr;
	if (key < root->val)
		root->left = deleteBST(root->left, key);
	else if (key > root->val)
		root->right = deleteBST(root->right, key);
	else
	{
		if (!root->left)
		{
			TreeNode *r = root->right;
			delete root;
			return r;
		}
		if (!root->right)
		{
			TreeNode *l = root->left;
			delete root;
			return l;
		}
		TreeNode *minNode = findMin(root->right);
		root->val = minNode->val;
		root->right = deleteBST(root->right, minNode->val);
	}
	return root;
}

// 重建二叉树
unordered_map<int, int> pos;

TreeNode *buildFromPreIn(vector<int> &pre, vector<int> &in, int l1, int r1, int l2, int r2)



{
	if (l1 > r1)
		return nullptr;
	int rootVal = pre[l1];
	TreeNode *root = new TreeNode(rootVal);
	int k = pos[rootVal];
	int leftLen = k - l2;
	root->left = buildFromPreIn(pre, in, l1 + 1, l1 + leftLen, l2, k - 1);
	root->right = buildFromPreIn(pre, in, l1 + leftLen + 1, r1, k + 1, r2);
	return root;
}
TreeNode *buildTree(vector<int> &pre, vector<int> &in)
{
	pos.clear();
	// 修复警告:强制转换 size_t 为 int
	for (int i = 0; i < (int)in.size(); ++i)
		pos[in[i]] = i;
	return buildFromPreIn(pre, in, 0, pre.size() - 1, 0, in.size() - 1);
}

// 树的直径
int diameter = 0;
int dfsDiameter(TreeNode *root)
{
	if (!root)
		return 0;
	int leftH = dfsDiameter(root->left);
	int rightH = dfsDiameter(root->right);
	diameter = max(diameter, leftH + rightH);
	return max(leftH, rightH) + 1;
}
int getDiameter(TreeNode *root)
{
	diameter = 0;
	dfsDiameter(root);
	return diameter;
}

// LCA (递归)
TreeNode *lca(TreeNode *root, TreeNode *p, TreeNode *q)
{
	if (!root || root == p || root == q)
		return root;
	TreeNode *left = lca(root->left, p, q);
	TreeNode *right = lca(root->right, p, q);
	if (left && right)
		return root;
	return left ? left : right;
}

// 平衡二叉树判断
bool isBalanced(TreeNode *root, int &height)
{
	if (!root)

	{
		height = 0;
		return true;
	}
	int lh, rh;
	if (!isBalanced(root->left, lh))
		return false;
	if (!isBalanced(root->right, rh))
		return false;
	if (abs(lh - rh) > 1)
		return false;
	height = max(lh, rh) + 1;
	return true;
}
bool isBalancedTree(TreeNode *root)
{
	int h;
	return isBalanced(root, h);
}

// 完全二叉树判断
bool isCompleteTree(TreeNode *root)
{
	if (!root)
		return true;
	queue<TreeNode *> q;
	q.push(root);
	bool nullSeen = false;
	while (!q.empty())

	{
		TreeNode *u = q.front();
		q.pop();
		if (!u)
		{
			nullSeen = true;
		}
		else
		{
			if (nullSeen)
				return false;
			q.push(u->left);
			q.push(u->right);
		}
	}
	return true;
}

// 满二叉树判断(兼容 C++11)
pair<int, bool> checkFull(TreeNode *root)
{
	if (!root)
		return make_pair(0, true);
	pair<int, bool> left = checkFull(root->left);
	pair<int, bool> right = checkFull(root->right);
	int lh = left.first, lf = left.second;
	int rh = right.first, rf = right.second;
	bool isFull = lf && rf && (lh == rh);
	return make_pair(max(lh, rh) + 1, isFull);
}

bool isFullTree(TreeNode *root)
{
	return checkFull(root).second;
}

// 清理内存
void deleteTree(TreeNode *root)
{
	if (!root)
		return;
	deleteTree(root->left);
	deleteTree(root->right);
	delete root;
}

// ================= 示例 main 函数(请按需取消注释并修改) =================
int main()
{
	// 示例:创建一棵树
	TreeNode *root = new TreeNode(1);
	root->left = new TreeNode(2);
	root->right = new TreeNode(3);
	root->left->left = new TreeNode(4);
	root->left->right = new TreeNode(5);

	cout << "结点数: " << countNodes(root) << endl;
	cout << "深度: " << maxDepth(root) << endl;
	cout << "叶子数: " << countLeaves(root) << endl;

	deleteTree(root);
	return 0;
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

标签云