数据结构算法-关于二叉树的创建问题

问题描述

关于二叉树的创建问题

我想在主函数中先创建一个二叉树,然后再遍历。但我的程序调用CreateBiTree输入完要输入的数之后,还是一直在等待输入,无法停止。以致无法执行到后面的遍历二叉树函数。望高手给解答下!

#include
#include
#include

struct?BiTree
{
int?data;
struct?BiTree?*lchild;
struct?BiTree?*rchild;
};

int?CreateBiTree(BiTree?*t)
{???
?????int?ch;
?scanf("%d",?&ch);
?????if(ch=='?')?t?=?NULL;???
?????else?
?{???
?????????if(?!(?t=(BiTree*)malloc(sizeof(BiTree)))?)?
?exit(1);
?????????t->data=ch;???
?????????CreateBiTree(t->lchild);???
?????????CreateBiTree(t->rchild);???
?????}?
?return?0;
}??

int?visit(BiTree?*BT)
{
??if(BT!=NULL)
????{
??????printf("%d?",BT->data);
??????visit(BT->lchild);
??????visit(BT->rchild);
????}
??return?0;
}

int?main()
{
????BiTree?*bitree;
????CreateBiTree(bitree);
visit(bitree);
return?0;
}

解决方案

  #include<stdio.h>
#include<stdlib.h>
struct BiTree
{
    int data;
    struct BiTree *lchild;
    struct BiTree *rchild;
};
int CreateBiTree(BiTree **t)
{
    int ch;
    scanf("%d", &ch);
    if(ch==0)
    {
        *t = NULL;
        return 0;
    }
    else
    {
        if( !( *t=(BiTree*)malloc(sizeof(BiTree))) )
            exit(1);
        (*t)->data=ch;
        CreateBiTree(&(*t)->lchild);
        CreateBiTree(&(*t)->rchild);
    }
    return 0;
}
int visit(BiTree *BT)
{
    if(BT!=NULL)
    {
        printf("%d ",BT->data);
        visit(BT->lchild);
        visit(BT->rchild);
    }
    return 0;
}
int main()
{
    BiTree *bitree;
    CreateBiTree(&bitree);
    visit(bitree);
    return 0;
}

解决方案二:

二叉树的创建的内存问题
二叉树创建时的一个问题
c# 二叉树的创建和各种问题

解决方案三:

有3个问题:
1.CreateBiTree函数里应当在if判断里加入return
2.CreateBiTree传参应该使用一级指针的引用或者二级指针,否则只是主函数里的指针的一个拷贝
3.if(ch == 0)我改成了这样

 #include<stdio.h>
#include<stdlib.h>
struct BiTree
{
    int data;
    struct BiTree *lchild;
    struct BiTree *rchild;
};
int CreateBiTree(BiTree *&t)
{
    int ch;
    scanf("%d", &ch);
    if(ch==0)
    {
        t = NULL;
        return 0;
    }
    else
    {
        if( !( t=(BiTree*)malloc(sizeof(BiTree))) )
            exit(1);
        t->data=ch;
        CreateBiTree(t->lchild);
        CreateBiTree(t->rchild);
    }
    return 0;
}
int visit(BiTree *BT)
{
    if(BT!=NULL)
    {
        printf("%d ",BT->data);
        visit(BT->lchild);
        visit(BT->rchild);
    }
    return 0;
}
int main()
{
    BiTree *bitree;
    CreateBiTree(bitree);
    visit(bitree);
    return 0;
}

解决方案四:

不需要在if(ch==0)后加return 你用了if else 最后有return 你的主要问题是你用到了递归,当你输入数据多时你就会无法确定还要输入几个0才结束

我一般是输入一个确定字符串再进行排序 如果你想插入到指定的地方你可以写一个排序的方法书上有

解决方案五:

递归在这里用有点不适合 ,你不知道他进行到哪步了

时间: 2024-11-05 06:24:41

数据结构算法-关于二叉树的创建问题的相关文章

JavaScript数据结构和算法之二叉树详解

 这篇文章主要介绍了JavaScript数据结构和算法之二叉树详解,本文讲解了二叉树的概念.二叉树的特点.二叉树节点的定义.查找最大和最小值等内容,需要的朋友可以参考下     二叉树的概念 二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点.二叉树中每一个节点都是一个对象,每一个数据节点都有三个指针,

【算法与数据结构】查找二叉树的实现

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.题目介绍     二叉树是一种基本的数据结构.查找二叉树是一种方便与查找,删除,插入等功能的二叉树,它要求每个父节点的左分支小于父节点,右分支大于父节点.下面我们来实现下面这个查找二叉树. 2.java代码实现 public class BinaryTree { private Node root; public BinaryTree(){ root=null; } /* * 定义内部节点 */ publ

关于二叉树的创建与遍历 请问哪里有问题我的代码

问题描述 关于二叉树的创建与遍历 请问哪里有问题我的代码 先输入一个字符串 然后求先中后序遍历http://paste.ubuntu.org.cn/4213378 #include #include char w[100]; struct node { char data; struct node *l; struct node *r; }; void creat(struct node *&T,char *w) { char ch;int p; ch=*w; if(ch=='') p=1; i

遍历-数据结构问题。二叉树,程序写了编译没错,但没办法运行。求大神看下。

问题描述 数据结构问题.二叉树,程序写了编译没错,但没办法运行.求大神看下. #include #define MAXLEN 100 using namespace std; typedef char elementType; typedef struct lBnode {elementType data; struct lBnode *lchild,*rchild; }Binode,*Bitree; void create(Bitree &T) //创建二叉链表 {char ch; cin>

求助!一个二叉树程序创建和遍历的程序

问题描述 求助!一个二叉树程序创建和遍历的程序 #include #include typedef char ElementType; typedef struct BiNode{ ElementType data; struct BiNode * lchild; struct BiNode * rchild; }BiNode; void CreatBiTree2(BiNode * T); void PreTraverBiTree(BiNode const * T); int main() {

二叉树的创建与遍历(递归版本)

非递归方式实现二叉树的创建与搜索,对于二叉树通常约定以前序遍历方式输入,若输入不正确是不会有什么显示的,这点要注意: 给出了C语言创建链表的俩种方式(不同于C++中引用传递) 一 创建二叉树方式: 方式一:输入指针 [cpp] view plain copy   void creatBT(BiTree *T)//建立一个二叉树   {       char ch;       scanf("%c",&ch);//读入字符       if(ch=='.')//.代表空子树  

递归算法-数据结构 算法 递归

问题描述 数据结构 算法 递归 编写一个递归算法,删除二叉树中所有叶子结点. 解决方案 void foo(Node * node) { if (node->left != null) { if (node->left->left == null && node->left->right == null) { delete(node->left); node->left = null; } else { foo(node->left); } }

二叉树的创建、前序遍历、中序遍历、后序遍历

// BTree.cpp : Defines the entry point for the console application. /* 作者:成晓旭 时间:2001年7月2日(9:00:00-14:00:00) 内容:完成二叉树的创建.前序遍历.中序遍历.后序遍历 时间:2001年7月2日(14:00:00-16:00:00) 内容:完成二叉树的叶子节点访问,交换左.右孩子 */ #include "stdafx.h" #include "stdlib.h"

指针-哪里有问题?求解答,数据结构算法的问题

问题描述 哪里有问题?求解答,数据结构算法的问题 /* 设计一个算法,将两个非递减的链表合并成一个非递增的有序链表 要求使用原来的存储空间,不开辟新的空间,表中允许有重复的数据./ / 我的思路是: 使用L1的头结点作为新表L3的头结点,然后让L1头结点的指针域置空, 从L1和L2中选择较大的结点,使用头插法插入到L3的后面, 为什么运行不了?求大神解答! */ void Combine(LinkList &L1,LinkList &L2,LinkList &L3){ struct