1:前中后序遍历 在用链表实现二叉树的时候我们要首先了解一下二叉树的遍历,让我们来看一下二叉树都有那些遍历 1.1 遍历规则 按照二叉树的遍历规则遍历有:前序.中序.后序。 (1)前序:首先访问根节点再去访问左右子树( 访 问顺序为:根结点、左⼦树、右⼦树) 例如上图:前序遍历:是A B D NULL NULL NULL C E NULL NULL F NULL NULL. (2)中序: 访问根结点的操作发⽣在遍历其左右⼦树之中( 访问顺序为:左⼦树、根结点、右⼦树 ) 例如上图: 中序遍历: NULL D NULL B NULL A NULL E NULL C NULL F NULL (3)后序: 访问根结点的操作发⽣在遍历其左右⼦树之后( 左⼦树、右⼦树、根结点 ) 例如上图:后续遍历: NULL NULL D NULL B NULL NULL E NULL NULL F C A 掌握这些规则后接下来我们来实现以下代码: 2:实现链式结构⼆叉树 用链表来表示二叉树,就是链表来表示元素的逻辑关系,和单链表的组成其实差不多二叉树里面要保函两个指针一个指向左子树一个指向右子树定义如下、
typedef char TrDatatype;
typedef struct Treenode {
TrDatatype data;
struct Treenode* left;
struct Treenode* right;
}Trnode;
前面提到了遍历方式那么我们如何用代码来实现前中后序列遍历呢?我们要首先手动构造一个二叉树如下。让各个结点指向该有的位置。
Trnode* buynode(TrDatatype x){
Trnode* node = (Trnode*)malloc(sizeof(Trnode));
node->data = x;
node->left = node->right = NULL;
return node;
}
Trnode *creadnode()
{
Trnode*NodeA = buynode('A');
Trnode*NodeB = buynode('B');
Trnode*NodeC = buynode('C');
Trnode*NodeD = buynode('D');
Trnode*NodeE = buynode('E');
Trnode*NodeF = buynode('F');
NodeA->left = NodeB;
NodeA->right = NodeC;
NodeB->left = NodeD;
NodeC->left = NodeE;
NodeC->right = NodeF;
return NodeA;
}
void test()
{
Trnode* tree= creadnode();
}
根结点的左⼦树和右⼦树分别⼜是由⼦树结点、⼦树结点的左⼦树、⼦树结点的右⼦树组成的,因此 ⼆叉树定义是递归式的,后序链式⼆叉树的操作中基本都是按照该概念实现的。首先我们来实现前序遍历:
void preorder(Trnode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
printf("%c ", root->data);
preorder(root->left);
preorder(root->right);
}
首先我们要先判断根是否为空为空或就打印NULL然后return 如果不为空我们就要打印根节点的值然后走到根结点的右字数然后因为右子树也是一个根节点我们也需要判断是否为空如果不为空继续打印然后继续重复操作直到最后一个为空然后依次返回,这个时候左子树遍历完了我们需要去递归的来遍历右边的字数所以继续走到遍历右边的代码直到结束可以根据下面流程图来看一下
中序:因为中序首先要遍历左节点所以要遍历遍历左节点然后就紧跟着打印数据
void Inorder(Trnode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
Inorder(root->left);
printf("%c ", root->data);
Inorder(root->right);
}
后序:因为这个要先遍历子树再去遍历根所以要先遍历再去打印
void Postorder(Trnode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
Postorder(root->left);
Postorder(root->right);
printf("%c ", root->data);
}
//二叉树的结点个数
首先判断跟根是否为空然后再去递归。
int treesize(Trnode* root)
{
if (root == NULL)
{
return 0;
}
return 1 + treesize(root->left) + treesize(root->right);
}
// ⼆叉树叶⼦结点个数
首先要判断叶子结点,叶子的结点的特征是左右子节点都为空所以直接判断两个都为空就是叶子结点
int treeleafsize(Trnode* root)
{
if (root == NULL)
{
return 0;
}
if (root->left == NULL && root->right == NULL)
{
return 1;
}
return treeleafsize(root->left) + treeleafsize(root->right);
}
// ⼆叉树第k层结点个数
当k为1就说是根节点这个结点,然后每次递归的时候让k减一。
int brandtreesize(Trnode* root, int k)
{
if (root == NULL)
{
return 0;
}
if (k == 1)
{
return 1;
}
return brandtreesize(root->left,k-1) + brandtreesize(root->right,k-1);
}
//⼆叉树的深度/⾼度
在我们要代码实现实现深度的时候,我们只要判断左右子节点那边的深度最深就可以了例如下图
两个都是度为三的二叉树我们第二个我们只需要去遍历右子结点的深度就可以实现
int treedepth(Trnode* root)
{
if (root == NULL)
{
return 0;
}
int leftdep = treedepth(root->left);
int rightdep = treedepth(root->right);
return 1+(leftdep>rightdep?leftdep:rightdep);
}
// ⼆叉树查找值为x的结点
我们在查找值的时候可以先遍历左边的然后左边没找都的情况下再去遍历右边的这样完全没有必要挨个遍历。
Trnode* brandtreefind(Trnode* root, TrDatatype x)
{
if (root == NULL)
{
return NULL;
}
if (root->data == x)
{
return root;
}
Trnode *lefrnode= brandtreefind(root->left, x);
if(lefrnode)
return lefrnode;
Trnode* rightnode = brandtreefind(root->right, x);
if (rightnode)
{
return rightnode;
}
//二叉树销毁
void treedestory(Trnode* root)
{
if (root == NULL)
{
return;
}
treedestory(root->left);
treedestory(root->right);
free(root);
}
下面放上总体代码
Tree.h
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef char TrDatatype;
typedef struct Treenode {
TrDatatype data;
struct Treenode* left;
struct Treenode* right;
}Trnode;
//前序遍历
void preorder(Trnode *root);
//中序遍历
void Inorder(Trnode* root);
//后续遍历
void Postorder(Trnode* root);
//二叉树的结点个数
int treesize(Trnode *root);
// ⼆叉树叶⼦结点个数
int treeleafsize(Trnode* root);
// ⼆叉树第k层结点个数
int brandtreesize(Trnode* root,int k);
//⼆叉树的深度/⾼度
int treedepth(Trnode* root);
// ⼆叉树查找值为x的结点
Trnode* brandtreefind(Trnode* root, TrDatatype x);
// ⼆叉树销毁
void treedestory(Trnode* root);
Tree.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Tree.h"
void preorder(Trnode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
printf("%c ", root->data);
preorder(root->left);
preorder(root->right);
}
void Inorder(Trnode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
Inorder(root->left);
printf("%c ", root->data);
Inorder(root->right);
}
void Postorder(Trnode* root)
{
if (root == NULL)
{
printf("NULL ");
return;
}
Postorder(root->left);
Postorder(root->right);
printf("%c ", root->data);
}
int treesize(Trnode* root)
{
if (root == NULL)
{
return 0;
}
return 1 + treesize(root->left) + treesize(root->right);
}
int treeleafsize(Trnode* root)
{
if (root == NULL)
{
return 0;
}
if (root->left == NULL && root->right == NULL)
{
return 1;
}
return treeleafsize(root->left) + treeleafsize(root->right);
}
int brandtreesize(Trnode* root, int k)
{
if (root == NULL)
{
return 0;
}
if (k == 1)
{
return 1;
}
return brandtreesize(root->left,k-1) + brandtreesize(root->right,k-1);
}
int treedepth(Trnode* root)
{
if (root == NULL)
{
return 0;
}
int leftdep = treedepth(root->left);
int rightdep = treedepth(root->right);
return 1+(leftdep>rightdep?leftdep:rightdep);
}
Trnode* brandtreefind(Trnode* root, TrDatatype x)
{
if (root == NULL)
{
return NULL;
}
if (root->data == x)
{
return root;
}
Trnode *lefrnode= brandtreefind(root->left, x);
if(lefrnode)
return lefrnode;
Trnode* rightnode = brandtreefind(root->right, x);
if (rightnode)
{
return rightnode;
}
return NULL;
}
void treedestory(Trnode* root)
{
if (root == NULL)
{
return;
}
treedestory(root->left);
treedestory(root->right);
free(root);
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"Tree.h"
Trnode* buynode(TrDatatype x){
Trnode* node = (Trnode*)malloc(sizeof(Trnode));
node->data = x;
node->left = node->right = NULL;
return node;
}
Trnode *creadnode()
{
Trnode*NodeA = buynode('A');
Trnode*NodeB = buynode('B');
Trnode*NodeC = buynode('C');
Trnode*NodeD = buynode('D');
Trnode*NodeE = buynode('E');
Trnode*NodeF = buynode('F');
NodeA->left = NodeB;
NodeA->right = NodeC;
NodeB->left = NodeD;
NodeC->left = NodeE;
NodeC->right = NodeF;
return NodeA;
}
void test()
{
Trnode* tree= creadnode();
/*preorder(tree);*/
/*Inorder(tree);*/
Postorder(tree);
int size = treesize(tree);
printf(" size:%d\n", size);
printf(" size:%d\n", size);
printf("leafsize:%d \n", treeleafsize(tree));
printf("klevelsize:%d \n", brandtreesize(tree, 2));
printf("kleveldepth:%d \n", treedepth(tree));
Trnode *node= brandtreefind(tree, 'A');
if (node == NULL)
{
printf("没找到\n");
}
else
{
printf("找到了\n");
}
treedestory(tree);
}
int main()
{
test();
}
谢谢大家如果有不对的地方望指正
标签:单链,Trnode,right,-------------,二叉树,return,NULL,root,left From: https://blog.csdn.net/qwer55588/article/details/143273300