二叉树是数据结构中一种重要的数据结构,也是树表家族最为基础的结构。
二叉树的定义:二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
⼆叉树有两种主要的形式:满⼆叉树
和完全⼆叉树
。
在一棵二叉树中,如果所有的分支节点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树成为满二叉树。
对一棵具有n个结点的二叉树按层序编号,如果编号为 i(1 ≤ i ≤ n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同,则这棵二叉树称为完全二叉树
二叉树的遍历方式主要可以分为四种:前序遍历、中序遍历、后序遍历和层序遍历。
简单记为中左右,也就是说先访问根节点,然后前序遍历左子树,再前序遍历右子树。
遍历的顺序为ABDGHCEIF
简单记为左中右,也就是说先访问二叉树最左边的结点,然后再访问中间的结点,最后再访问右边的结点。·
遍历的顺序为GDHBAEICF
简单记为左右中,也就是说先访问二叉树最左边的结点,然后再访问右边的结点,最后再访问中间的结点。·
遍历的顺序为GHDBIEFCA
从根结点开始访问,从上而下逐层遍历,在同一层中·,按从左到右的顺序对结点逐个访问。
遍历的顺序为ABCDEFGHI
前序遍历、中序遍历和后序遍历就是中的位置不一样,前序遍历就是中左右,中序遍历就是左中右,后序遍历就是左右中。
前中后序遍历都是深度搜索,层序遍历是广度搜索。
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
void CreatTreeNode(TreeNode*&T){
char c;
cin >> c;
if(c=='*'){
T = NULL;
return;
}
else{
T = new TreeNode;
T->val = c;
CreatTreeNode(T->left);
CreatTreeNode(T->right);
}
}
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return;
vec.push_back(cur->val); // 中
traversal(cur->left, vec); // 左
traversal(cur->right, vec); // 右
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return;
traversal(cur->left, vec); // 左
vec.push_back(cur->val); // 中
traversal(cur->right, vec); // 右
}
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return;
traversal(cur->left, vec); // 左
traversal(cur->right, vec); // 右
vec.push_back(cur->val); // 中
}