秦晓彬 发表于 2014-5-7 21:24:36

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

#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 ;
求大神指点

秦晓彬 发表于 2014-5-7 21:26:27

感觉在create_bt函数里面,出现了问题,但是不知道是怎么回事,求教{:5_109:}

HHR 发表于 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;
}

秦晓彬 发表于 2014-5-7 22:50:09

HHR 发表于 2014-5-7 22:31 static/image/common/back.gif


大神,好像形参是不可以分配内存的,形参是不能做左值的
不过,思想蛮好的,谢谢

elvo 发表于 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;
}

秦晓彬 发表于 2014-5-8 12:42:04

elvo 发表于 2014-5-8 11:13 static/image/common/back.gif
运行了一下前面的程序,但运行不出结果,于是调试了一下,修改程序如下:

这样就可以了吗,感觉,还是有点问题呀,不管怎么样,先运行一下再说,谢谢

Stduy_Student 发表于 2014-5-10 08:42:10

可以看看的

HHR 发表于 2014-5-10 09:32:27

秦晓彬 发表于 2014-5-7 22:50 static/image/common/back.gif
大神,好像形参是不可以分配内存的,形参是不能做左值的
不过,思想蛮好的,谢谢

左值相当于地址值,右值相当于数据值
&符号放在一个变量声明或者是函数的形参声明前就是引用
如果放在一个已经定义的变量前,就是取地址
。。。

沧海.sea 发表于 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());
                }
        }
}
页: [1]
查看完整版本: 简单地二叉树的创建和遍历,有点不会,求指点