C语言二叉树的创建及递归遍历

zz/2024/4/13 13:54:07

C语言二叉树的创建及递归遍历

1.二叉树的创建

首先,要先构建结构体。

typedef struct TreeNode{SElemType data;struct TreeNode *lchild,*rchild;
}TreeNode,*BiTree;

其中,data为数据域,存放二叉树中结点的数据。两指针类型lchild和rchild分别指向该结点的左右孩子。
构造好结点后,现在可以来创建二叉树了。
构造二叉树就是将需要输入的数据分别保存到data域中,并将lchild和rchild指向需要指向的下一个结点。
现在是用递归实现二叉树的创建。
代码如下:

int CreateTree(BiTree *root){ char ch;scanf("%c",&ch);getchar();if(ch=='#'){*root=NULL;}else{*root=(TreeNode *)malloc(sizeof(TreeNode));if(!*root)exit(-1);(*root)->data=ch;CreateTree(&((*root)->lchild));CreateTree(&((*root)->rchild));}return 0;
}

用ch来接收输入的字符,下一行要用到getchar()函数用来接收换行符,此处我是用字符’#‘用来判断二叉树分支的终止。
通过递归将二叉树实现。
比如仅有一个根结点的树,data为’a’,此时需要输入的是:a # #
这应该很容易理解,向根结点中输入数据a,此时a是根节点的数据,递归向根结点的左孩子输入数据,此时输入为‘#’,该层函数结束,则返回上一层,此时遍历根结点的右孩子,此时输入也为‘#’,该层函数结束,则返回上一层,结束。
此处是递归的应用,理解递归,此处就很好理解。

2.递归实现二叉树的先序、中序、后序遍历

void PreOrderTraverse(BiTree root){  //先序遍历if(root){printf("%c ",root->data);PreOrderTraverse(root->lchild);PreOrderTraverse(root->rchild); }
}void InOrderTraverse(BiTree root){  //中序遍历if(root){InOrderTraverse(root->lchild);printf("%c ",root->data);InOrderTraverse(root->rchild); }
}void PostOrderTraverse(BiTree root){  //后序遍历if(root){PostOrderTraverse(root->lchild);PostOrderTraverse(root->rchild); printf("%c ",root->data);}
}

http://www.ngui.cc/zz/2700901.html

相关文章

IDEA创建SpringBoot项目出现Initialization failed for ‘https://start.spring.io‘ Please check URL...

用IDEA创建SpringBoot项目时出现: Initialization failed for ‘https://start.spring.io’ Please check URL, network and proxy settings. Error message: Cannot download ‘https://start.spring.io’: Read timed out 网上也看了许多方法,但都没…

java案例GUI-入门案例

package com.demo1;import javax.swing.*;public class SimpleGUI1{public static void main(String[] args) { JFrame frame new JFrame(); //创建frameJButton button new JButton("Click me"); //创建buttonframe.setDefaultCloseOperation(JFrame.E…

为Gui添加事件监听、事件源、事件

package com.demo1;import java.awt.event.*;import javax.swing.JButton; import javax.swing.JFrame;public class SimpleGUI1B implements ActionListener{ //实现此接口。这表示SimpleGui1B是个ActionListener(事件只会通知有实现ActionListener的类&#xff0…

C++串口通讯(含所有源代码)

开发环境&#xff1a;VS2012&#xff0c;win32控制台程序&#xff0c;打开串口COM2并监听线程 <span style"color:#444444">可以使用虚拟串口软件VSPM和串口调试助手进行程序的测试与验证. </span> 显示结果界面 运行主函数类&#xff1a;ComTest3.cpp …

基于QT对UDP类的封装

main.cpp #include <iostream> #include "udp.h"using namespace std;int main(int argc, char *args[]) //argc表示接收的命令个数,args[]传入的命令内容 {cout<< "argc" << argc <<endl;if(argc > 1){myudp udp;char buf[…

关于交流接触器的基本知识_交流接触器的功能认识

一些青年才俊&#xff0c;某些基础的电路图&#xff0c;能随意画出&#xff0c;而且画的非常规范&#xff0c;甚至可以熟练的拆装交流接触器。到了实际工作中&#xff0c;可能在一段时间内会一头雾水&#xff0c;出现这样的现象很正常。实践中多总结提炼&#xff0c;多注重下方…

LeetCode/整数翻转

题目&#xff1a; 一上来就莽撞的写题&#xff0c;结果并不是简单地两三位数的翻转。 int是32位的&#xff0c;4个字节&#xff0c;一个字节8位&#xff0c;那么0x80000000 的2进制是 1000,0000,0000,0000,0000,0000,0000,0000。第一位是符号位&#xff0c;表示负的&#x…

笔记—R语言做相关气泡图

library(corrplot) data <- read.table(file.choose(), header T,sep \t) new_data <- data[,-1] ?cor ??par pr <- cor(new_data, method "pearson") pr1 <- cor(x new_data[1:10],y new_data[11:18], method "pearson") pr2 <- …

如何查看 安卓证书 的签名

如何查看 安卓证书 的签名 自有安卓证书的签名查看方法 1&#xff09;通过命令查看 电脑上要装有Java 找见Java目录下的keytool.exe 打开运行&#xff0c;输入cmd&#xff0c;打开命令提示符&#xff0c;进入Java所在的盘 通过 cd 命令进入keytool.exe所在的文件夹 输入keyto…

vue 使用 swiper 实现轮播的那些事

首先运行 npm下载 npm install swiper --save-dev在需要用到的页面中 <template><div class"banner"><div class"swiper-container"><div class"swiper-wrapper"><div class"swiper-slide"><img s…