二叉树链式结构的实现
1.二叉树链式结构的遍历
是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。
- NLR:前序遍历(Preorder Traversal 亦称先序遍历)访问根结点的操作发生在遍历其左右子树之前。
根->左子树->右子树 - LNR:中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中。
左子树->根->右子树 - LRN:后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。
左子树->右子树->根
前序:A B D NULL NULL E NULL NULL C NULL NULL
(ABDEC)
中序: NULL D NULL B NULL E NULL A NULL C NULL
(DBEAC)
后序: NULL NULL D NULL NULL E B NULL NULL C A
(DEBCA)
1.1层序遍历
设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
在这里插入代码片
#include <stdio.h>
#include <stdlib.h>
typedef char BTDataType;
typedef struct BinaryTreeNode
{
BTDataType _data;
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
}BTNode;
void PrevOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
printf("%c", root->_data);
PrevOrder(root->_left);
PrevOrder(root->_right);
}
int TreeSize(BTNode* root)
{
return 0;
}
BTNode* CreateNode(int x)
{
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
node->_data = x;
node->_left = NULL;
node->_right = NULL;
return node;
}
int main()
{
BTNode* A = CreateNode('A');
BTNode* B = CreateNode('B');
BTNode* C = CreateNode('C');
BTNode* D = CreateNode('D');
BTNode* E = CreateNode('E');
A->_left = B;
A->_right = C;
B->_left = D;
B->_right = E;
PrevOrder(A);
return 0;
}
全部实现(前中后序列)
#include <stdio.h>
#include <stdlib.h>
typedef char BTDataType;
typedef struct BinaryTreeNode
{
BTDataType _data;
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
}BTNode;
void PostOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL "); return;
}
PostOrder(root->_left);
PostOrder(root->_right);
printf("%c", root->_data);
}
void PrevOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL "); return;
}
printf("%c", root->_data);
PrevOrder(root->_left);
PrevOrder(root->_right);
}
void InOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL "); return;
}
InOrder(root->_left);
printf("%c", root->_data);
InOrder(root->_right);
}
int TreeSize(BTNode* root)
{
return 0;
}
BTNode* CreateNode(int x)
{
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
node->_data = x;
node->_left = NULL;
node->_right = NULL;
return node;
}
int main()
{
BTNode* A = CreateNode('A');
BTNode* B = CreateNode('B');
BTNode* C = CreateNode('C');
BTNode* D = CreateNode('D');
BTNode* E = CreateNode('E');
A->_left = B;
A->_right = C;
B->_left = D;
B->_right = E;
PrevOrder(A);
printf("\n");
InOrder(A);
printf("\n");
PostOrder(A);
printf("\n");
return 0;
}
树的大小
在这里插入代码片
#include <stdio.h>
#include <stdlib.h>
typedef char BTDataType;
typedef struct BinaryTreeNode
{
BTDataType _data;
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
}BTNode;
void PostOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL "); return;
}
PostOrder(root->_left);
PostOrder(root->_right);
printf("%c", root->_data);
}
void PrevOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL "); return;
}
printf("%c", root->_data);
PrevOrder(root->_left);
PrevOrder(root->_right);
}
void InOrder(BTNode* root)
{
if (root == NULL)
{
printf("NULL "); return;
}
InOrder(root->_left);
printf("%c", root->_data);
InOrder(root->_right);
}
int TreeSize(BTNode* root)
{
if (root == NULL)
return 0;
else
return 1 + TreeSize(root->_left) + TreeSize(root->_right);
}
BTNode* CreateNode(int x)
{
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
node->_data = x;
node->_left = NULL;
node->_right = NULL;
return node;
}
int main()
{
BTNode* A = CreateNode('A');
BTNode* B = CreateNode('B');
BTNode* C = CreateNode('C');
BTNode* D = CreateNode('D');
BTNode* E = CreateNode('E');
A->_left = B;
A->_right = C;
B->_left = D;
B->_right = E;
PrevOrder(A);
printf("\n");
InOrder(A);
printf("\n");
PostOrder(A);
printf("\n");
printf("TreeSize:%d\n", TreeSize(A));
printf("TreeSize:%d\n", TreeSize(A));
return 0;
}