鱼C论坛

 找回密码
 立即注册
查看: 3900|回复: 9

简单地二叉树的创建和遍历,有点不会,求指点

[复制链接]
发表于 2014-5-7 21:24:36 | 显示全部楼层 |阅读模式
5鱼币
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std ;

typedef struct btnode
{
        char val ;
        struct btnode *lchild ,*rchild ;
}BTNODE;

BTNODE* create_bt (BTNODE* node )
{
        int ch;
        //scanf("%c" ,&ch );
        cin>>ch;
        BTNODE *p ,*head=NULL;//operate
        p=node;
        p=(BTNODE*)malloc(sizeof(BTNODE));
        if('#'==ch)
        {
                p=NULL;
        }
        else
        {
                        if(p->val=ch ) head=p;
                        create_bt(p->lchild);
                        create_bt(p->rchild);
        }

        return (head) ;
}
void visit (char val ,int level)
{
        printf("%c是%d层\n" ,val ,level);
}
void preorder (BTNODE* node ,int level)
{
        BTNODE* p ;
        p=node;
        if(p)
        {
                visit(p->val , level );
                preorder(p->lchild ,level+1);
                preorder(p->rchild ,level+1);
        }
}
int main ()
{
        int level=0 ;
        BTNODE *head;
        head=create_bt(NULL);
        preorder(head ,level);
        return 0;
}

PS:我在创建的时候,不小心创建成了.cpp,所以出现了#inlcude<iostream> using namespace std ;
求大神指点

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-7 21:26:27 | 显示全部楼层
感觉在create_bt函数里面,出现了问题,但是不知道是怎么回事,求教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-7 22:31:25 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

typedef struct btnode
{
        char val ;
        struct btnode *lchild ,*rchild ;
}BTNODE, *BiTree;

// 二叉链表--排序树
void Creat( BiTree &bt )
{
        char x;

        scanf("%c", &x );
        if( x == '#' )
        {
                bt = NULL;
        }
        else
        {
                bt = ( BiTree )malloc( sizeof( BTNODE ) );
                bt ->val = x;
                Creat( bt ->lchild );
                Creat( bt ->rchild );
        }
}

void visit (char val ,int level)
{
        printf("%c是%d层\n" ,val ,level);
}

void preorder (BTNODE* node ,int level)
{
        BTNODE* p ;
        p=node;
        if(p)
        {
                visit(p->val , level );
                preorder(p->lchild ,level+1);
                preorder(p->rchild ,level+1);
        }
}
int main ()
{
        int level=0 ;
        BTNODE *head = NULL;
        
        Creat( head );
        
        preorder(head ,level);
        
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-7 22:50:09 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-8 11:13:31 | 显示全部楼层
运行了一下前面的程序,但运行不出结果,于是调试了一下,修改程序如下:
//#include <stdio.h>
//#include <stdlib.h>
#include <iostream>
using namespace std ;

typedef struct btnode
{
        char val ;
        struct btnode *lchild ,*rchild ;
}BTNODE;

BTNODE* create_bt (BTNODE* node )
{
        //int ch;
        char ch;
        //scanf("%c" ,&ch );
        cin>>ch;
        //BTNODE *p ,*head=NULL;//operate
        //p=node;
        //p=(BTNODE*)malloc(sizeof(BTNODE));
        if('#'==ch)
        {
                return NULL;
        }
        else
        {
                node=(BTNODE*)malloc(sizeof(BTNODE));
                node->val=ch;
                node->lchild=create_bt(node->lchild);
            node->rchild=create_bt(node->rchild);
                        //if(p->val=ch ) head=p;
                        //create_bt(p->lchild);
                        //create_bt(p->rchild);
        }

        return (node) ;
}
void visit (char val ,int level)
{
        //printf("%c是%d层\n" ,val ,level);
        cout<<val<<"是"<<level<<"层"<<endl;
}
void preorder (BTNODE* node ,int level)
{
        BTNODE* p ;
        p=node;
        if(p)
        {
                visit(p->val , level );
                preorder(p->lchild ,level+1);
                preorder(p->rchild ,level+1);
        }
}
int main ()
{
        int level=0 ;
        BTNODE *head;
        head=create_bt(NULL);
        preorder(head ,level);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-8 12:42:04 | 显示全部楼层
elvo 发表于 2014-5-8 11:13
运行了一下前面的程序,但运行不出结果,于是调试了一下,修改程序如下:

这样就可以了吗,感觉,还是有点问题呀,不管怎么样,先运行一下再说,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-10 08:42:10 | 显示全部楼层
可以看看的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-10 09:32:27 | 显示全部楼层
秦晓彬 发表于 2014-5-7 22:50
大神,好像形参是不可以分配内存的,形参是不能做左值的
不过,思想蛮好的,谢谢

左值相当于地址值,右值相当于数据值
&符号放在一个变量声明或者是函数的形参声明前就是引用
如果放在一个已经定义的变量前,就是取地址
。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-10 20:08:52 | 显示全部楼层
package sun;

import java.util.Scanner;

public class BinaryTree {
        
        private Scanner scanner;
        public static void main(String[] args) {
                BinaryNode<String> note = new BinaryNode<String>("start", null);
                BinaryTree bt = new BinaryTree();
                bt.createBiTree(note);
                bt.preorderTraversal(note);
        }

        //创建二叉树
        public void createBiTree(BinaryNode<String> node){
                createLeftChild(node);
                createRightChild(node);
        }
        public void createLeftChild(BinaryNode<String> node){
                System.out.println("Please Input:");
                scanner = new Scanner(System.in);
                String data = scanner.next();
                if(!data.equals("e")){
                        node.setLeftChild(new BinaryNode<String>(data, node));                
                        createLeftChild(node.getLeftChild());
                        createRightChild(node.getRightChild());
                }
        }
        public void createRightChild(BinaryNode<String> node){
                System.out.println("Please Input:");
                scanner = new Scanner(System.in);
                String data = (String) scanner.next();
                if(!data.equals("e")){
                        node.setRightChild(new BinaryNode<String>(data, node));
                        createLeftChild(node);
                        createRightChild(node);
                }
        }
        
        //前序遍历二叉树
        public void preorderTraversal(BinaryNode<String> node){
                System.out.println(node.getData());
                if(node.getLeftChild() != null){
                        preorderTraversal(node.getLeftChild());
                }
                if(node.getRightChild() != null){
                        preorderTraversal(node.getRightChild());
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 03:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表