二叉树(Binary Tree)是数据结构中的基础类型,广泛应用于查找、排序、图结构、表达式计算等算法中。下面将从 概念定义 → 分类 → 常用操作 → 核心算法 → C++代码示例 全面介绍。
一、二叉树基本概念
二叉树是一种每个节点最多有两个子节点(左孩子和右孩子)的树结构。常见术语:
根节点 (root):没有父节点的节点叶子节点 :没有任何子节点高度 :节点到叶子节点最长路径上的边数完全二叉树 :除了最后一层,其他层节点都满,且最后一层节点从左向右排列满二叉树 :所有非叶节点都有两个子节点
二、常见二叉树类型类型 描述 普通二叉树 每个节点最多两个子节点 二叉搜索树(BST) 左子树值 < 当前节点 < 右子树值 平衡二叉树(AVL) 任意节点左右子树高度差 ≤ 1 完全二叉树 除最底层外都是满的,底层从左到右连续 堆(最大/最小堆) 满足堆性质的完全二叉树 红黑树 / Treap / 伸展树 自平衡 BST 的高级实现
三、常见操作和算法操作 说明 插入 / 删除 / 查找 常用于 BST、AVL、红黑树 遍历 先序 / 中序 / 后序 / 层序遍历 最大最小值 通常用于 BST 高度 / 直径计算 深度优先搜索 判断平衡性、对称性、路径和 常见面试题考点
四、遍历方式详解与代码
1. 递归遍历(先序、中序、后序)
struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode ( int x) : val ( x) , left ( nullptr ) , right ( nullptr ) { }
} ;
void preorder ( TreeNode* root) { if ( ! root) return ; std:: cout << root-> val << " " ; preorder ( root-> left) ; preorder ( root-> right) ;
}
void inorder ( TreeNode* root) { if ( ! root) return ; inorder ( root-> left) ; std:: cout << root-> val << " " ; inorder ( root-> right) ;
}
void postorder ( TreeNode* root) { if ( ! root) return ; postorder ( root-> left) ; postorder ( root-> right) ; std:: cout << root-> val << " " ;
}
2. 层序遍历(BFS)
# include <queue>
void levelOrder ( TreeNode* root) { if ( ! root) return ; std:: queue< TreeNode* > q; q. push ( root) ; while ( ! q. empty ( ) ) { TreeNode* cur = q. front ( ) ; q. pop ( ) ; std:: cout << cur-> val << " " ; if ( cur-> left) q. push ( cur-> left) ; if ( cur-> right) q. push ( cur-> right) ; }
}
五、常见算法题示例(C++)
1. 判断是否为合法 BST
bool isValidBST ( TreeNode* root, TreeNode* min = nullptr , TreeNode* max = nullptr ) { if ( ! root) return true ; if ( ( min && root-> val <= min-> val) || ( max && root-> val >= max-> val) ) return false ; return isValidBST ( root-> left, min, root) && isValidBST ( root-> right, root, max) ;
}
2. 二叉树最大深度
int maxDepth ( TreeNode* root) { if ( ! root) return 0 ; return 1 + std:: max ( maxDepth ( root-> left) , maxDepth ( root-> right) ) ;
}
3. 路径总和是否等于 target
bool hasPathSum ( TreeNode* root, int sum) { if ( ! root) return false ; if ( ! root-> left && ! root-> right) return sum == root-> val; return hasPathSum ( root-> left, sum - root-> val) || hasPathSum ( root-> right, sum - root-> val) ;
}
六、二叉搜索树(BST)操作实现
插入节点
TreeNode* insert ( TreeNode* root, int val) { if ( ! root) return new TreeNode ( val) ; if ( val < root-> val) root-> left = insert ( root-> left, val) ; else root-> right = insert ( root-> right, val) ; return root;
}
查找最小值
int findMin ( TreeNode* root) { while ( root-> left) root = root-> left; return root-> val;
}
七、刷题推荐(适合 LeetCode)题目 类型 104. 二叉树最大深度 递归 226. 翻转二叉树 后序 110. 平衡二叉树 DFS + 剪枝 101. 对称二叉树 递归+比较子树结构 230. BST中第K小元素 中序遍历 124. 二叉树中的最大路径和 DFS回溯 236. 最近公共祖先(LCA) 递归思维 297. 二叉树序列化和反序列化 递归+层序
八、补充:建树方法
TreeNode* buildTree ( const std:: vector< int > & nodes, int & i) { if ( i >= nodes. size ( ) || nodes[ i] == - 1 ) { ++ i; return nullptr ; } TreeNode* root = new TreeNode ( nodes[ i++ ] ) ; root-> left = buildTree ( nodes, i) ; root-> right = buildTree ( nodes, i) ; return root;
}
总结方向 推荐算法题 遍历操作 先中后序,层序 递归思维 深度、路径和、翻转、判断 BST 搜索 最近公共祖先、寻找节点路径 构造树 根据前序+中序建树、序列化反序列化 优化技巧 剪枝、缓存、DFS+回溯