📝前言
一棵二叉树是结点的一个有限集合,该集合:
- 或者为空
- 由一个根节点加上两棵别称为左子树和右子树的二叉树组成
二叉树可以没有节点(空树)否则,它包含一个根节点,这个根节点最多可以有两个分支:左子树和右子树,左右子树也符合二叉树的定义,可以是空树,或者由根节点和其左右子树组成。
因此二叉树的定义采用的是递归的思想:一个二叉树要么为空,要么由根节点和其左右两个子二叉树组成。左右子树本身也符合二叉树的定义,可以递归定义下去。
本小节我们将学习二叉树的前中后序遍历!
🌠 创建简单二叉树
在学习二叉树的基本操作之前,需要先创建一棵二叉树,然后才能学习相关的基本操作。由于现在大家对二叉树结构的理解还不够深入,为了降低学习成本,这里手动快速创建一棵简单的二叉树,以便快速进入二叉树操作学习。等大家对二叉树结构有了一定了解之后,再深入研究二叉树的真正创建方式。
手插简单二叉树代码:
// 二叉树节点结构体定义 typedef struct BinTreeNode { // 左子节点指针 struct BinTreeNode* left; // 右子节点指针 struct BinTreeNode* right; // 节点值 int val; }BTNode; // 创建节点,分配内存并返回 BTNode* BuyBTNode(int val) { BTNode* newnode = (BTNode*)malloc(sizeof(BTNode)); // 空间分配失败 if (newnode == NULL) { perror("malloc fail"); return NULL; } // 初始化节点值 newnode->val = val; // 初始化左右子节点为NULL newnode->left = NULL; newnode->right = NULL; return newnode; } // 创建示例树 BTNode* CreateTree() { // 创建节点1-6 BTNode* n1 = BuyBTNode(1); BTNode* n2 = BuyBTNode(2); BTNode* n3 = BuyBTNode(3); BTNode* n4 = BuyBTNode(4); BTNode* n5 = BuyBTNode(5); BTNode* n6 = BuyBTNode(6); // 构建树结构 n1->left = n2; n1->right = n4; n2->left = n3; n4->left = n5; n4->right = n6; return n1; // 返回根节点 }
二叉树的图像:
注意:上述代码并不是创建二叉树的方式,真正创建二叉树方式后序详解重点讲解。
🌉二叉树的三种遍历
学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。
🌠前序
您说得对,我来补充一下前序遍历的注释:
前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
算法:
访问根节点 -> 前序遍历左子树 -> 前序遍历右子树
- 即先访问根节点,然后遍历其左子树,再遍历其右子树。
注意:
递归基准条件是当根节点为NULL时返回。访问根节点要放在递归左右子树之前,这保证了根节点一定先于其子节点被访问。递归左子树和右子树的顺序不能调换,否则就不是前序遍历了。
代码:
vvoid PreOrder(BTNode* root) { if (root == NULL) { printf("N "); return; } printf("%d ", root->val); PreOrder(root->left); PreOrder(root->right); } int main() { BTNode* root = CreateTree(); PreOrder(root); printf("\n"); }
前序递归图解:
运行:
🌉中序遍历
中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。中序遍历是在遍历一个结点的左子树后,然后访问这个结点,最后遍历它的右子树。
void InOrder(BTNode* root) { if (root == NULL) { printf("N "); return; } InOrder(root->left); printf("%d ", root->val); InOrder(root->right); }
【算法与数据结构】二叉树(前中后)序遍历2:https://developer.aliyun.com/article/1474433