数据结构实验——二叉树的基本操作与算法设计(先根、中根、后根遍历,查找关键字)

① 先根次序遍历查找首个关键字为key                                

BinaryNode<T> search(T key)                     

② 返回key结点所在的层次

int level(T key)

三、实验方法与步骤(需求分析、算法设计思路、流程图等)

实验一: 先根次序遍历查找首个关键字为key

分析: 首先要构造空二叉树,先根次序遍历二叉树。返回先根次序遍历二叉树所有结点的描述字符串,包含空子树标记。在以p为根的子树中查找并返回先根次序遍历中首次出现的关键字为key的结点,左右子树分别查找,若未找到,返回值null。

实验二返回key结点所在的层次

分析:返回key结点所在的层次,若空树或者未找到key,则返回-1.令根节点等于1。分别从左右子树查找,直到找出key所在的层次。

四、实验原始纪录(源程序、数据结构等)

  public class BinaryNode<T>

{

    public T data;                             //数据域,存储数据元素

    public BinaryNode<T> left, right;//链域,分别指向左、右孩子结点

       //构造结点,data指定元素,leftright分别指向左孩子和右孩子结点

       public BinaryNode(T data, BinaryNode<T> left, BinaryNode<T> right)

       {

           this.data = data;

           this.left = left;

           this.right = right;

       }

       public BinaryNode(T data)    //构造元素为data的叶子结点

       {

           this(data, null, null);

       }

       public String toString()      //返回结点数据域的描述字符串

       {

           return this.data.toString();

       }

       public boolean isLeaf()       //判断是否叶子结点

       {

           return this.left==null && this.right==null;

       }

}

 

 public class BinaryTree<T>                       //二叉树类,二叉链表存储,T指定结点的元素类型

{

      public  BinaryNode<T> root;                  //根结点,二叉链表结点结构

      private Object value;

       public BinaryTree()                          //构造空二叉树

       {

           this.root=null;

       }

       public boolean isEmpty()                     //判断是否空二叉树

       {

           return this.root==null;

       }

       public void preorder()  //输出先根次序遍历序列

       {

          preorder(this.root);

          System.out.println();

       }

       private void preorder(BinaryNode<T> p)

       {

          if(p!=null);

          {

             System.out.println(p.data.toString()+"");

             preorder(p.left);

             preorder(p.right);

          }

       }

       public String toString()  //返回先根次序遍历二叉树所有结点的描述字符串,包含空子树标记

       {

          return toString(this.root);

       }

       private String toString(BinaryNode<T> p)

       {

          if(p==null)

             return"^";

          return p.data.toString()+""+toString(p.left)+toString(p.right);  递归调用

       }

       public void inorder() //中根遍历

       {

          inorder(this.root);

          System.out.println();

       }

       private void inorder(BinaryNode<T>p)

       {

         

          if(p!=null)

          {

             inorder(p.left);

             System.out.print(p.data.toString()+"");

             inorder(p.right);

          }

       }

       public void postorder()  //后根遍历

       {

          postorder(this.root);

          System.out.println();

       }

       private void postorder(BinaryNode<T>p)

       {

          if(p!=null)

          {

             postorder(p.left);

             postorder(p.right);

             System.out.print(p.data.toString()+"");

          }

       }

//查找并返回先根次序遍历首次出现的关键字为key结点

       public BinaryNode<T> search(T key)

    {

    return search(root, key);

    }

//   方法一:在以p为根的子树中查找并返回首次出现的关键字为key元素结点,若未找到返回null,先根次序遍历

     private BinaryNode<T> search(BinaryNode<T> p, T key)

   {

     if (p==null || key==null)

        return null;

     if (p.data.equals(key))

        return p;                            //查找成功,返回找到结点

     BinaryNode<T> find=search(p.left, key);  //在左子树中查找,递归调用

     if (find==null)                          //若在左子树中未找到

        find=search(p.right, key);           //则继续在右子树中查找,递归调用

     return find;                             //返回查找结果

   }

     public boolean contains(T key)               //判断是否包含关键字为key元素

  {

     return this.search(key)!=null;  //

}

  public BinaryTree(T[] prelist)             //以先根和中根次序遍历序列构造二叉树

 {

    this.root = create(prelist);

 }

 private int i=0;

 private BinaryNode<T> create(T[] prelist)

 {

   BinaryNode<T>p=null;

   if(i<prelist.length)

   {

      T elem=prelist[i];

      i++;

      if (elem!=null)

      {

          p=new BinaryNode<T>(elem);

          p.left=create(prelist);

          p.right=create(prelist);

      }

   }

   return p;

  

}

//方法二: 返回x结点所在的层次,若空树或未查找到x返回-1

public int getLevel(T x)

{

    return getLevel(root, 1, x);                //令根结点的层次为1

}

private int getLevel(BinaryNode<T> p, int i, T x)

{

    if (p==null)                            

        return -1;

    if (p.data.equals(x))

        return i;                            //查找成功

    int level = getLevel(p.left, i+1, x);       //在左子树查找

    if (level==-1)

        level = getLevel(p.right, i+1, x);      //继续在右子树中查找

    return level;

}

public static void main(String args[])

{

    String[] prelist= {"A","B","D",null,"G",null,null,"C","E",null,null,"F","H"};

    BinaryTree<String> bitree= new BinaryTree<String>(prelist);

    System.out.println("二叉树的先根次序遍历序列:  "+bitree.toString());  //标明空子树

    System.out.println("二叉树的中根次序遍历序列:  ");  bitree.inorder();

    System.out.println("二叉树的后根次序遍历序列:  ");  bitree.postorder();

    System.out.println("先根次序遍历查找首个关键字为: "+bitree.search("B"));

    bitree.getLevel("E");

    System.out.println("查找的关键字所在层数为: " +bitree.getLevel("E"));

   

}

}

五、实验结果及分析(计算过程与结果、数据曲线、图表等)

实验结果:

猜你喜欢

转载自blog.csdn.net/weixin_45823684/article/details/122470096