目录
二叉树:
typedef int BTDataType;
typedef struct BinaryTreeNode
{
BTDataType _data;
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
}BTNode;
BTNode* CreatBinaryTree()
{
BTNode* node1 = BuyNode(1);
BTNode* node2 = BuyNode(2);
BTNode* node3 = BuyNode(3);
BTNode* node4 = BuyNode(4);
BTNode* node5 = BuyNode(5);
BTNode* node6 = BuyNode(6);
node1->_left = node2;
node1->_right = node4;
node2->_left = node3;
node4->_left = node5;
node4->_right = node6;
return node1;
}
1 二叉树的前、中、后序遍历
1.1 前序、中序以及后序遍历
学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。
按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历:
- 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
- 中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
- 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。
由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。
// 二叉树前序遍历
void preOrder(BTNode* root);
// 二叉树中序遍历
void inOrder(BTNode* root);
// 二叉树后序遍历
void postOrder(BTNode* root);
1.2 前序遍历递归图解
1.3 前序遍历递归调用函数图解
图中二叉树
前序遍历结果:1 2 3 4 5 6
中序遍历结果:3 2 1 5 4 6
后序遍历结果:3 1 5 6 4 1
中序和后序调用和前序的递归调用差不多,只是访问顺序不同,此处不再赘述。
1.3 前中后序遍历代码实现
1.3.0 创建一个固定的二叉树
- 思路:写死一个固定二叉树,申请空间,然后手动指向左右子树
创建二叉树就是这个样子的
- 创建二叉树代码实现
typedef int BTDataType;
typedef struct BinaryTreeNode
{
BTDataType _data;
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
}BTNode;
BTNode* BuyNode(BTDataType x)
{
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
if (node == NULL)
{
perror("malloc fail");
return NULL;
}
node->_data = x;
node->_left = NULL;
node->_right = NULL;
return node;
}
BTNode* CreatBinaryTree()
{
BTNode* node1 = BuyNode(1);
BTNode* node2 = BuyNode(2);
BTNode* node3 = BuyNode(3);
BTNode* node4 = BuyNode(4);
BTNode* node5 = BuyNode(5);
BTNode* node6 = BuyNode(6);
node1->_left = node2;
node1->_right = node4;
node2->_left = node3;
node4->_left = node5;
node4->_right = node6;
return node1;
}
1.3.1 前序遍历
前序遍历是 :根 左 右
二叉树的前序遍历结果实际是:1 2 3 MULL NULL NULL 45 NULL NULL 6 NUL NULL
我们不打印NULL就是:1 2 3 4 5 6
- 前序遍历代码实现
//前序
void preOrder(BTNode * root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
printf("%d ", root->_data);
preOrder(root->_left);
preOrder(root->_right);
}
- 前序遍历代码验证1
- 前序遍历代码验证2
1.3.2 中序遍历
前序遍历是 : 左 根 右
二叉树的前序遍历结果实际是:NULL 3NULL 2 NL 1NLL 5 NULL 4 NULL 6 NULL
我们不打印NULL就是:3 2 1 5 4 6
//中序遍历
void inOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
inOrder(root->left);