二叉树的创建、先序、中序、后序遍历、层次遍历、树的高度、结点数、叶子结点数、左右结点交换

#二叉树的创建、先序、中序、后序遍历、层次遍历、树的高度、结点数、叶子结点数、左右结点交换
下面展示一些 内联代码片

#include <stdio.h>
#include <iostream>
#include <malloc.h>
#include <string.h>
using namespace std;
//定义二叉树结构
typedef struct Node
{
    char data;
    struct Node *lchild,*rchild;//创建左右结点指针
}*BTree,BTNode;
//程序使用的函数
void CreateBTree(BTree &T);//按先序遍历方式创建二叉树
void PreOrderTraverse(BTree T);//先序遍历函数
void InOrderTraverse(BTree T);//中序遍历函数
void PostOrderTraverse(BTree T);//后序遍历函数
void LevelTraverse(BTree T) ;//层次遍历函数
int SearchDepth(BTree T);//求树的高度度函数
int NodeNum(BTree T);//求二叉树中结点个数函数
int LeafNum(BTree T);//求二叉树中叶子结点个数函数
void ExChangeTree(BTree &T);//左右结点交换函数

//按先序遍历方式创建二叉树
void CreateBTree(BTree &T)
{
    char ch;
    cin>>ch;//将输入的字符储存在数组ch中
    if(ch=='*')//定义符号*为空树
		T=NULL;
    else  //输入字符不为*,将其储存在树中
	{
        T=new BTNode;
        T->data=ch;
        CreateBTree(T->lchild);
        CreateBTree(T->rchild);
    }
}
//先序遍历函数
void PreOrderTraverse(BTree T)
{
    if(T!=NULL)//当结点不为空时,遍历二叉树
    {
        cout<<T->data;
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}
//中序遍历函数
void InOrderTraverse(BTree T)
{
    if(T!=NULL)//当结点不为空时,遍历二叉树
    {
        InOrderTraverse(T->lchild);
        cout<<T->data;
        InOrderTraverse(T->rchild);
    }

}

//后序遍历函数
void PostOrderTraverse(BTree T)
{
    if(T!=NULL)//当结点不为空时,遍历二叉树
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        cout<<T->data;
    }

}


//层次遍历函数
void LevelTraverse(BTree T)            
{
    if(T==NULL) 
	{
		printf("二叉树为空树");
		return;
	}
    BTNode *queue[50];            //创建应该队列
    int front=0;
    int rear=0;
    BTNode *p;        
    queue[rear]=T;//树根入队
    while(front!=rear)//当前端和后端不相等时
    {     
        p=queue[front];//p指向根,读出根,并出队
        printf("%c",p->data);//输出二叉树的结点
        if(p->lchild!=NULL)     //左子树不为空,入队
        {
            queue[rear]=p->lchild;
        }
        if(p->rchild!=NULL)   //右子树不为空,入队
        {
            queue[rear]=p->rchild;
        }
    }
}


//求树的高度度函数
int SearchDepth(BTree T)
{
    if(T==NULL)
	{
		return 0;
	}
    else
    {
        int m=SearchDepth(T->lchild);
        int n=SearchDepth(T->rchild);
        if(m>n) 
		{
			return (m+1);
		}
        else 
		{
			return (n+1);
		}
    }
}
//求二叉树中结点个数函数
int NodeNum(BTree T)
{
    if(T==NULL) //如果第一个为空节点,则二叉树为空,返回值为0
	{
		return 0;
	}
    else //第一个结点不为空,结点数为左右子树数加上第一个结点
	{
		return NodeNum(T->lchild)+NodeNum(T->rchild)+1;
	}
}
//求二叉树中叶子结点个数函数
int LeafNum(BTree T)
{
    if(T==NULL) //如果第一个为空节点,则二叉树为空,返回值为0
	{
		return 0;
	}
    if(T->lchild==NULL &&T->rchild==NULL)//如果二叉树左右子树皆为空,说明该二叉树只有根节点为叶子节点,返回值1.
	{
        return 1;
    }
	else   //否则叶子结点数为左右子树之和
	{
        return LeafNum(T->lchild)+LeafNum(T->rchild);
    }
}

//左右结点交换函数
void ExChangeTree(BTree &T)
{
    BTree tem;
    if(T!=NULL)//判断T是否为空,非空进行转换,否则不转换
	{
        tem=T->lchild;
        T->lchild=T->rchild;//直接交换节点地址
        T->rchild=tem;
        ExChangeTree(T->lchild);
        ExChangeTree(T->rchild);
    }
}

int main()//主函数调用前面子函数并输出结果
{
    BTree T;
    cout<<"按先序遍历方式创建二叉树(用*表示空树):";
    CreateBTree(T);
    cout<<"中序遍历输出结果:";
    InOrderTraverse(T);
    cout<<endl<<"先序遍历输出结果:";
    PreOrderTraverse(T);
    cout<<endl<<"后序遍历输出结果:";
    PostOrderTraverse(T);
	cout<<endl<<"层次遍历输出结果:";
	LevelTraverse(T);
    cout<<endl<<"树的高度:"<<SearchDepth(T);
    cout<<endl<<"总结点的个数:"<<NodeNum(T);
    cout<<endl<<"叶结点的个数:"<<LeafNum(T);
    BTree temporarytree=T;  //复制一颗树,在不改变原树的情况下,对临时树进行交换。
    ExChangeTree(temporarytree);
    cout<<endl<<"左右结点交换结果:";
	PreOrderTraverse(temporarytree);
	printf("\n");
    return 0;
}

### 回答1: 以下是基于递归方式实现的代码: ```c #include <stdio.h> #include <stdlib.h> // 二叉树结点结构体 typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 创建结点 TreeNode* newNode(int val) { TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } // 先序遍历 void preorder(TreeNode* root) { if (root == NULL) { return; } printf("%d ", root->val); preorder(root->left); preorder(root->right); } // 中序遍历 void inorder(TreeNode* root) { if (root == NULL) { return; } inorder(root->left); printf("%d ", root->val); inorder(root->right); } // 后序遍历 void postorder(TreeNode* root) { if (root == NULL) { return; } postorder(root->left); postorder(root->right); printf("%d ", root->val); } int main() { // 创建示例二叉树 TreeNode* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); root->right->left = newNode(6); root->right->right = newNode(7); // 输出各种遍历结果 printf("Preorder traversal: "); preorder(root); printf("\n"); printf("Inorder traversal: "); inorder(root); printf("\n"); printf("Postorder traversal: "); postorder(root); printf("\n"); return 0; } ``` 输出结果为: ``` Preorder traversal: 1 2 4 5 3 6 7 Inorder traversal: 4 2 5 1 6 3 7 Postorder traversal: 4 5 2 6 7 3 1 ``` ### 回答2: 按照先序遍历、中序遍历和后序遍历输出二叉树的所有节点的C语言代码实现如下: ```c #include <stdio.h> #include <stdlib.h> // 结点数据结构 typedef struct Node { char data; struct Node* left; struct Node* right; } Node; // 创建结点 Node* createNode(char data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->left = newNode->right = NULL; return newNode; } // 先序遍历 void preOrderTraversal(Node* root) { if (root != NULL) { printf("%c ", root->data); preOrderTraversal(root->left); preOrderTraversal(root->right); } } // 中序遍历 void inOrderTraversal(Node* root) { if (root != NULL) { inOrderTraversal(root->left); printf("%c ", root->data); inOrderTraversal(root->right); } } // 后序遍历 void postOrderTraversal(Node* root) { if (root != NULL) { postOrderTraversal(root->left); postOrderTraversal(root->right); printf("%c ", root->data); } } int main() { // 创建二叉树 Node* A = createNode('A'); Node* B = createNode('B'); Node* C = createNode('C'); Node* D = createNode('D'); Node* E = createNode('E'); Node* F = createNode('F'); A->left = B; A->right = C; B->left = D; B->right = E; C->right = F; // 先序遍历 printf("先序遍历结果:"); preOrderTraversal(A); printf("\n"); // 中序遍历 printf("中序遍历结果:"); inOrderTraversal(A); printf("\n"); // 后序遍历 printf("后序遍历结果:"); postOrderTraversal(A); printf("\n"); return 0; } ``` 在代码中,我们首先定义了一个结构体`Node`来表示二叉树结点,其中包含了结点据和左右子节点的指针。然后,我们实现了三个函来分别实现先序遍历、中序遍历和后序遍历。在每个函中,我们使用递归的方式对二叉树进行遍历,并在每个结点输出据。 在主函中,我们创建了一个简单的二叉树,并依次调用先序中序后序遍历输出二叉树的所有结点。最后,我们在控制台打印出遍历结果。 请注意,以上代码只是演示了如何实现二叉树的三种遍历方式,具体的二叉树构建过程需要根据实际情况进行调整。 ### 回答3: 以下是使用C语言实现先序中序后序遍历输出二叉树的代码: 先序遍历(Preorder Traversal): ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* left; struct Node* right; }; // 先序遍历函 void preorderTraversal(struct Node* node) { if (node != NULL) { printf("%d ", node->data); // 输出当前结点据 preorderTraversal(node->left); // 递归遍历左子 preorderTraversal(node->right); // 递归遍历右子 } } int main() { // 创建示例二叉树 struct Node* root = (struct Node*)malloc(sizeof(struct Node)); root->data = 1; root->left = (struct Node*)malloc(sizeof(struct Node)); root->left->data = 2; root->right = (struct Node*)malloc(sizeof(struct Node)); root->right->data = 3; root->left->left = (struct Node*)malloc(sizeof(struct Node)); root->left->left->data = 4; root->left->right = (struct Node*)malloc(sizeof(struct Node)); root->left->right->data = 5; // 输出先序遍历结果 printf("Preorder Traversal: "); preorderTraversal(root); return 0; } ``` 中序遍历(Inorder Traversal): ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* left; struct Node* right; }; // 中序遍历函 void inorderTraversal(struct Node* node) { if (node != NULL) { inorderTraversal(node->left); // 递归遍历左子 printf("%d ", node->data); // 输出当前结点据 inorderTraversal(node->right); // 递归遍历右子 } } int main() { // 创建示例二叉树,代码同先序遍历中的创建部分 // 输出中序遍历结果 printf("Inorder Traversal: "); inorderTraversal(root); return 0; } ``` 后序遍历(Postorder Traversal): ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* left; struct Node* right; }; // 后序遍历 void postorderTraversal(struct Node* node) { if (node != NULL) { postorderTraversal(node->left); // 递归遍历左子 postorderTraversal(node->right); // 递归遍历右子 printf("%d ", node->data); // 输出当前结点据 } } int main() { // 创建示例二叉树,代码同先序遍历中的创建部分 // 输出后序遍历结果 printf("Postorder Traversal: "); postorderTraversal(root); return 0; } ``` 以上代码演示了如何创建一个二叉树,并分别使用先序中序后序遍历进行遍历操作。注意,这里的二叉树结点是手动创建的示例,你可以根据需要修改或扩展代码来创建你自己的二叉树
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值