二叉树的创建和遍历(C版和java版)

二叉树的创建和遍历(C版和java版)

以这颗树为例:#表示空节点
前序遍历(根->左->右)为:ABD##E##C#F##
中序遍历(左->根->右)为:#D#B#E#A#C#F#
后序遍历(左->右->根)为:##D##EB###FCA


#include <stdio.h>
#include <stdlib.h>

typedef char TElemType;
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild; 

}BiTNode,*BiTree;

void ForEachTree(BiTree T)
{
    if(T == NULL){
        return;
    }
//    printf(" %c ",T->data);前序遍历
    ForEachTree(T->lchild);
    printf(" %c ",T->data);//中序遍历
    ForEachTree(T->rchild);
//    printf(" %c ",T->data);后序遍历
}

void CreateBiTree(BiTree *T)
{
    TElemType ch;
    scanf("%c",&ch);
    if('#' == ch){
        *T = NULL;
    }else{
        *T = (BiTree)malloc(sizeof(BiTNode));
    

        (*T)->data = ch;
        CreateBiTree(&(*T)->lchild);
    
        CreateBiTree(&(*T)->rchild);
    
    }
}
void main(){
    //前序创建树,中序输出树
    BiTree T;//根节点
    CreateBiTree(&T);

    ForEachTree(T);

}

二叉树的创建和遍历(C版和java版)

 java版本实现:

由于java没有c的指针,所以相对于c来说实现起来比较别扭,但思路没问题

在java中,不管这个节点是不是空节点,都会申请空间,只不过这个节点的数据、左子树、右子树都是null,但这个节点不是null,如下图

二叉树的创建和遍历(C版和java版)

public class BiThrTree {
      
    public void createTree(BiThrNode T){
        String str;
        str = new Scanner(System.in).next();
        if("#".equals(str)){
            //如果是'#',则不做任何处理,也就是说这个节点的数据、左孩子、右孩子都是null
            //但这个节点不是null,这里需要注意
        }else{
            T.data = str;//给节点赋值
           
            T.lchild = new BiThrNode();
            T.rchild = new BiThrNode();
            createTree(T.lchild);
            createTree(T.rchild);
            
        }
    }
    public void forEachTree(BiThrNode T){
        if(T.data == null){//判断这个节点的数据是否为空
            return;
        }
        forEachTree(T.lchild);
        forEachTree(T.rchild);
        System.out.print(T.data);//后序遍历
        
    }
   public static void main(String[] args) {
        BiThrNode T = new BiThrNode();
        new BiThrTree().createTree(T);
        new BiThrTree().forEachTree(T);
              
    }
    
}

class BiThrNode{
    String data;
    BiThrNode lchild;
    BiThrNode rchild;
  
}

 二叉树的创建和遍历(C版和java版)二叉树的创建和遍历(C版和java版)