二叉树
二叉树是一种树形数据结构,它由节点和边组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的特点是每个节点最多有两个子节点,且左子节点的值小于父节点的值,右子节点的值大于父节点的值。
二叉树的应用非常广泛,例如在计算机科学中,二叉树被用于搜索算法、排序算法、编译器、数据库等领域。
下面是一个二叉树的案例:
5
/ \
3 7
/ \ \
2 4 8
这是一个包含7个节点的二叉树,根节点的值为5,左子节点的值为3,右子节点的值为7。左子节点有两个子节点,值分别为2和4,右子节点有一个子节点,值为8。这个二叉树满足二叉搜索树的条件,即左子节点的值小于父节点的值,右子节点的值大于父节点的值。
完全二叉树
完全二叉树是一种特殊的二叉树,它满足以下两个条件:
- 所有的叶子节点都在最后一层或倒数第二层。
- 最后一层的叶子节点都靠左排列,而且除了最后一层,其他层的节点个数都是满的。
完全二叉树的性质:
- 对于任意一个完全二叉树,如果其节点数为n,则其深度为log2(n+1)。
- 对于任意一个完全二叉树的第i个节点,如果i>1,则其父节点为i/2,左子节点为2i,右子节点为2i+1。
下面是一个完全二叉树的例子:
1
/ \
2 3
/ \ / \
4 5 6 7
这个完全二叉树有7个节点,深度为3。它满足完全二叉树的两个条件,所有叶子节点都在最后一层,最后一层的叶子节点都靠左排列。除了最后一层,其他层的节点个数都是满的。节点1的左子节点为2,右子节点为3,节点2的左子节点为4,右子节点为5,节点3的左子节点为6,右子节点为7。
合并二叉树
例题:
给定两个二叉树,将它们合并为一个新的二叉树。合并规则是:如果两个节点重叠,那么将它们的值相加作为新节点的值;否则不为 NULL 的节点将直接作为新节点。
示例:
输入:
Tree 1 Tree 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
输出:
合并后的树:
3
/ \
4 5
/ \ \
5 4 7
源码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if (t1 == NULL) {
return t2;
}
if (t2 == NULL) {
return t1;
}
TreeNode* root = new TreeNode(t1->val + t2->val);
root->left = mergeTrees(t1->left, t2->left);
root->right = mergeTrees(t1->right, t2->right);
return root;
}
};