IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 二叉树建立 遍历时出现的问题c -> 正文阅读

[C++知识库]二叉树建立 遍历时出现的问题c

二叉树创建并遍历
代码如下

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct  btnode
	  {
struct btnode*lchild,*rchild;
int data;
	   }NODE;
main()
{
	NODE *root=(NODE*)malloc(sizeof(NODE)),*q,n;
	NODE *create(NODE *p);
	void preorder();
	void inorder();
	void postorder();
    int t;
	q=&n;
	root=create(q);
	
	printf("At  the first,we create   a tree\n");
	printf("Please input nodes of tree\n");
	if  (root==NULL)    printf("It's  an empty  tree!\n");
	else
	   {
		printf("\n1.The preordetraverse  \n");
	    printf("  2.The inordertraverse \n");
	    printf("  3.The postordertraverse \n");
		printf("  Please choose  a  kind  of  order\n");
		scanf("%d",&t);
		switch   (t)
		   {
			case 1: preorder(root);  break;
			case 2: inorder(root);   break;
			case 3:postorder(root);   break;
			default: printf(" The error!");
		   }
		}
}

NODE  * create(NODE *p)    /*create the structure of binary tree */
 {
 char ch;
	
    scanf("%d",&ch);
	if(ch=='#')  p=NULL;
else{
	  p=(NODE*)malloc(sizeof(NODE));
	  p->data=ch;
	  create(p->lchild);
	  create(p->rchild);
}
return p;
 }
void preorder(NODE *root)   /*travel the tree using preorder */
 {
 if(root->data==NULL) return;
printf("%d",root->data);
preorder(root->lchild);
preorder(root->rchild);
 }
 
void   inorder (NODE *root)  /*travel  the tree using inorder */
 {
if(root->data==NULL) return;
inorder(root->lchild);
printf("%d",root->data);
inorder(root->rchild);
 }
 
void postorder(NODE *root)  /*travel the tree using  postorder */

{
if(root->data==NULL) return;
postorder(root->lchild);
postorder(root->rchild);
printf("%d",root->data);
}


主要问题
1.遍历创建二叉树时每次给p分配空间在return后数据无法传入上一层就会出现只有第一个根节点有值的情况

为解决这个问题我们将遍历创建语句改一下,例如


	p=(NODE*)malloc(sizeof(NODE));
	p->data=ch;
	p->lchild=create(p->lchild);
	p->rchild=create(p->rchild);

目的将下一层的指针指向的地址(包括结点值和它指向的所有结点)传给上一层,这样p就不会丢失结点。
(∩_∩)
2.在遍历时判断二叉树是否为空语句需要改进,例如

 if(root->data==NULL) return;

这句空返回语句看似没有问题,问题在于此函数是用 void定义,不能返回指针类型,返回就会出现
Segmentation fault (core dumped)
的错误,同样这个错误有时也会出现在指针分配空间出现问题上
为了不再重新改动函数定义类型,我们将判断语句修改一下,例如

	if(root)
 {
printf("%c",root->data);
preorder(root->lchild);
preorder(root->rchild);
}

直接判断此时指向的root指针是否为空即可。

以下是修改后全部代码

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct  btnode
	  {
struct btnode*lchild,*rchild;
int data;

	   }NODE;
int main()
{
	NODE *root,*q;
	NODE *create(NODE *p);
	void preorder();
	void inorder();
	void postorder();
    int t;
	q=(NODE*)malloc(sizeof(NODE));;
	
	printf("At  the first,we create   a tree\n");
	printf("Please input nodes of tree\n");
	root=create(q);
	
	if  (root==NULL)    printf("It's  an empty  tree!\n");
	else
	   {
		printf("\n1.The preordetraverse  \n");
	    printf("  2.The inordertraverse \n");
	    printf("  3.The postordertraverse \n");
		printf("  Please choose  a  kind  of  order\n");
		scanf("%d",&t);
		switch   (t)
		   {
			case 1: preorder(root);  break;
			case 2: inorder(root);   break;
			case 3:postorder(root);   break;
			default: printf(" The error!");
		   }
		}
}

NODE  * create(NODE *p)    /*create the structure of binary tree */
 {
	
 char ch;
    scanf("%c",&ch);
	if(ch=='#')  {p=NULL;
	//printf("%c",ch);
	}
else{
    
	p=(NODE*)malloc(sizeof(NODE));
	p->data=ch;
	//printf("p的值为%c",p->data);
	p->lchild=create(p->lchild);
	p->rchild=create(p->rchild);
	
}

return p;
 }
void preorder(NODE *root)   /*travel the tree using preorder */

 {
 	if(root)
 {
printf("%c",root->data);
preorder(root->lchild);
preorder(root->rchild);
}
 }
void   inorder (NODE *root)  /*travel  the tree using inorder */

 {
	if(root){
inorder(root->lchild);
printf("%c",root->data);
inorder(root->rchild);
}
 }
void postorder(NODE *root)  /*travel the tree using  postorder */

{
    if(root){
postorder(root->lchild);
postorder(root->rchild);
printf("%c",root->data);
}
}

运行结果
在这里插入图片描述在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:12:48  更:2021-12-04 13:13:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:28:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码