`

二叉树

 
阅读更多
二叉树

无序数组: 查找删除慢,大小固定
有序数组:插入慢 删除幔
链表:查找慢,插入和删除慢

树的相关概念:
树: 由边连接着节点而构成

根: 树顶端的节点称为根,一棵树只有一个根
父节点:每个节点(除了跟) 都恰好有一条边线上连接到另外一个节点,上面的这个节点就是下面的这个节点的父节点

子节点:每个节点 都可能有一条边线下连接到另外一个节点,下面的这个节点就是上面的这个节点的子节点

叶节点:没有子节点的节点称为叶节点

子树:每个节点都可以作为"子树"根,它和它多有的子孙节点都含在子树中

二叉树是非平衡树,树中每个节点下面,最多有两个子节点,他的每一个节点,左子节点比该节点小,右子节点比该节点大.

二叉树的查找:速度是非常快的

二叉树的插入:插入节点和当前节点比较,小放左边,大放右边

二叉树的删除:先找到要删除的节点,
如果该节点有两个子节点,节点删除,右子树最左边的节点代替原来删除的节点
如果该节点只有左子节点,节点删除,左子节点代替原来删除的节点
如果该节点只有右子节点,节点删除,右子节点代替原来删除的节点
如果该节点没有子节点,直接删除.


package com.test.tree;


import java.util.Stack;  

public class BinaryTree {  
  private Node root;  
  public BinaryTree(){  
      root = null;  
  }  
    
  public void insert(int iData,double dData){  
      Node newNode = new Node();  
      newNode.setiData(iData);  
      newNode.setdData(dData);  
      if(root == null){//空树  
          root = newNode;  
      }else{  
          Node current = root;  
          Node parent;  
          while(true){  
              parent = current;  
              if(iData<current.getiData()){//往左边找  
                  current = current.getLeftChild();  
                  if(current==null){//左边的为空了,插入newNode  
                      parent.setLeftChild(newNode);  
                      return;  
                  }  
              }else{//否则往右边找  
                  current = current.getRightChild();  
                  if(current == null){//右边为空了,插入newNode  
                      parent.setRightChild(newNode);  
                      return;  
                  }  
              }  
          }  
      }  
  }  
    
  public boolean delete(int key){  
      Node current = root;  
      Node parent = root;  
      boolean isLeftChild = true;  
      while(current.getiData() != key){//找到要删除的节点current  
          parent = current;  
          if(key<current.getiData()){  
              isLeftChild = true;  
              current = current.getLeftChild();  
          }else{  
              isLeftChild = false;  
              current = current.getRightChild();  
          }  
          if(current ==null) return false;//没有找到要删除的节点,返回false,删除失败  
      }  
      if(current.getLeftChild() == null && current.getRightChild()==null){//current没有子节点,直接删除  
          if(current ==root)root = null;  
          else if(isLeftChild){  
              parent.setLeftChild(null);  
          }else{  
              parent.setRightChild(null);  
          }  
      }else if(current.getRightChild() == null){//要删除的节点只有左子节点  
          if(current == root ) root = current.getLeftChild();  
          else if(isLeftChild) parent.setLeftChild(current.getLeftChild());  
          else parent.setRightChild(current.getLeftChild());  
      }else if (current.getLeftChild() == null){//要删除的节点只有右节点  
          if(current == root ) root = current.getRightChild();  
          else if(isLeftChild) parent.setLeftChild(current.getRightChild());  
          else parent.setRightChild(current.getRightChild());  
      }else{//要删除的节点有两个子节点,current右边子树的最左边的那个节点替换current  
          Node replace = getReplace(current);  
          if(current == root) root = replace;  
          else if(isLeftChild) parent.setLeftChild(replace);  
          else parent.setRightChild(replace);  
          replace.setLeftChild(current.getLeftChild());  
      }  
      return true;  
  }  

  private Node getReplace(Node delNode) {  
      Node replaceParent = delNode;  
      Node replace = delNode;  
      Node current = delNode.getRightChild();  
      while(current != null){//找到要删除节点右边子树的最左边的那个节点  
          replaceParent = replace;  
          replace = current;  
          current = current.getLeftChild();  
      }  
      if(replace != delNode.getRightChild()){  
          replaceParent.setLeftChild(replace.getRightChild());  
          replace.setRightChild(delNode.getRightChild());  
      }  
      return replace;  
  }  
    
  public Node find(int key){  
      Node current = root;  
      while(current.getiData() != key){  
          if(key<current.getiData()){  
              current = current.getLeftChild();  
          }else{  
              current = current.getRightChild();  
          }  
          if(current == null) return null;  
      }  
      return current;  
  }  
    
  public void traverses(int traverseType){//从左到右,从下到上  
      switch(traverseType){  
      case 1://从上至下,从左到右  
          System.out.println("\n Preorder traversal:");  
          preOrder(root); 
          System.out.println();
          break;  
      case 2://从下至上,从左到右  
          System.out.println("\n Inorder traversal:");  
          inOrder(root); 
          System.out.println();
          break;  
      case 3://从下至上,从右到左  
          System.out.println("\n Postorder traversal:");  
          postOrder(root); 
          System.out.println();
          break;  
      }  
  }  

  private void postOrder(Node localRoot) {//从下至上,从右到左  
      if(localRoot!=null){  
          postOrder(localRoot.getRightChild());  
          postOrder(localRoot.getLeftChild());  
          System.out.print(localRoot.getiData()+" ");  
      }  
        
  }  

  private void inOrder(Node localRoot) {//从下至上,从左到右  
      if(localRoot != null){  
          inOrder(localRoot.getLeftChild());  
          System.out.print(localRoot.getiData()+" ");  
          inOrder(localRoot.getRightChild());  
      }  
        
  }  

  private void preOrder(Node localRoot) {//从上至下,从左到右  
      if(localRoot!=null){  
          System.out.print(localRoot.getiData()+" ");  
          preOrder(localRoot.getLeftChild());  
          preOrder(localRoot.getRightChild());  
      }  
  }  
    
  public void displayTree(){  
      Stack<Node> globalStack = new Stack<Node>();  
      globalStack.push(root);  
      int nBlanks =32;  
      boolean isRowEmpty = false;  
      System.out.println("----------------------------------------------------------------");  
      while(isRowEmpty == false){  
          Stack<Node> localStack = new Stack<Node>();  
          isRowEmpty = true;  
          for(int j=0;j<nBlanks;j++){  
        	  for(j=0;j<nBlanks-2; j++){  
                  System.out.print(" ");  
              }   
              while(globalStack.isEmpty()==false){  
                  Node temp= (Node)globalStack.pop();  
                  if(temp!=null){  
                      System.out.print(temp.getiData());  
                      localStack.push(temp.getLeftChild());  
                      localStack.push(temp.getRightChild());  
                      if(temp.getLeftChild()!=null || temp.getRightChild()!=null){  
                          isRowEmpty = false;  
                      }  
                  }else{  
                      System.out.print("**");  
                      localStack.push(null);  
                      localStack.push(null);  
                  }  
                  for(j=0;j<nBlanks*2-2; j++){  
                      System.out.print(" ");  
                  }  
              }//while end  
              System.out.println();  
              nBlanks/=2;  
              while(localStack.isEmpty()==false){  
                  globalStack.push(localStack.pop());  
              }  
          }  
          System.out.println(".............................................................");  
      }  
  }  
}  


package com.test.tree;
public class Node {  
    private int iData;  
    private double dData;  
    private Node leftChild;  
    private Node rightChild;  
      
    public void display(){  
        System.out.println(toString());  
    }  
      
      
    /** 
     * @return the iData 
     */  
    public int getiData() {  
        return iData;  
    }  
  
  
    /** 
     * @param iData the iData to set 
     */  
    public void setiData(int iData) {  
        this.iData = iData;  
    }  
  
  
    /** 
     * @return the dData 
     */  
    public double getdData() {  
        return dData;  
    }  
  
  
    /** 
     * @param dData the dData to set 
     */  
    public void setdData(double dData) {  
        this.dData = dData;  
    }  
  
  
  
  
  
    public Node getLeftChild() {
		return leftChild;
	}


	public void setLeftChild(Node leftChild) {
		this.leftChild = leftChild;
	}


	public Node getRightChild() {
		return rightChild;
	}


	public void setRightChild(Node rightChild) {
		this.rightChild = rightChild;
	}


	@Override
	public String toString() {
		return "Node [iData=" + iData + ", dData=" + dData + ", leftChild="
				+ leftChild + ", rightChild=" + rightChild + "]";
	}





package com.test.tree;

import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
  
public class BinaryTreeTest {  
      
    public static String getString()throws IOException{  
        InputStreamReader is = new InputStreamReader(System.in);  
        BufferedReader br =  new BufferedReader(is);  
        return br.readLine();  
    }  
      
    public static char getChar()throws IOException{  
        return getString().charAt(0);  
    }  
    public static int getInt()throws IOException{  
        return Integer.parseInt(getString());  
    }  
    /** 
     * @param args 
     * @throws IOException  
     */  
    public static void main(String[] args) throws IOException {  
        int value;  
        BinaryTree t = new BinaryTree();  
        int nodeNumber = 10;
        for(int i=0;i<nodeNumber;i++){
        	int iData = (int)(Math.random()*(100-10)+10);//10-100 random data
        	t.insert(iData, 1.5d);
        }
       
  
        while(true){  
            System.out.print("Enter first letter of show, insert, find,delete or traverse:");  
            char choice = getChar();  
            switch(choice){  
            case 's'://display  
                t.displayTree();  
                break;  
            case 'i'://insert  
                System.out.print("Enter value to insert:");  
                value =  getInt();  
                t.insert(value, 9.9d);  
                break;  
            case 'f'://find  
                System.out.print("Enter value to find:");  
                value =  getInt();  
                Node found = t.find(value);  
                if(found!=null){  
                    System.out.print("found:");  
                    found.display();  
                    System.out.println();  
                }else{  
                    System.out.println("could not find "+value);  
                }  
                break;  
            case 'd'://delete  
                System.out.print("Enter value to delete:");  
                value =  getInt();  
                boolean result = t.delete(value);  
                if(result){  
                    System.out.println("delete successful");  
                }else{  
                    System.out.println("delete failed");  
                }  
                break;  
            case 't':  
                System.out.print("Enter traverse type 1,2 or 3:");  
                value = getInt();  
                t.traverses(value);  
                break;  
            default:  
                System.out.println("Invalid input");  
            }  
        }  
    }  
  
}  

分享到:
评论

相关推荐

    二叉树深度_二叉树查询_二叉树深度_

    二叉树是一种在计算机科学中广泛应用的数据结构,它由节点(也称为结点)组成,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的深度是指从根节点到最远叶节点的最长路径上边的数目,即树的最大层数...

    二叉树演示 实现二叉树图形显示

    二叉树是一种特殊的树结构,每个节点最多只有两个子节点,通常分为左子节点和右子节点。在计算机科学中,二叉树被广泛应用于数据的组织和操作,如搜索、排序、文件系统等。本例子关注的是如何实现二叉树的图形显示,...

    根据后序二叉树序列构造二叉树_扩展二叉树

    在计算机科学领域,二叉树是一种基础的数据结构,它由结点构成,每个结点最多有两个子节点,分别称为左子节点和右子节点。在众多的二叉树操作中,根据后序遍历序列(也称为后序序列)来构造二叉树是一项常见的任务。...

    二叉树建立 二叉树基本算法的实现

    (2)先序、中序、后序遍历二叉树:递归算法。 (3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点...

    第六章 树和二叉树作业及答案(100分).docx

    - **答案解析**:如果一棵二叉树的中序遍历序列和后序遍历序列正好相反,那么该二叉树一定是任一结点都没有左孩子的二叉树。 #### 5. 二叉树的结点数范围 - **答案解析**:深度为k的二叉树最多有\(2^k - 1\)个结点...

    将满二叉树转化为求和二叉树_二叉树_

    在IT领域,特别是数据结构和算法的学习中,二叉树是一种重要的抽象数据类型。满二叉树是一种特殊的二叉树,其中每一层都是完全填充的,除了可能的最后一层,且最后一层的所有节点都尽可能地向左靠拢。而将满二叉树...

    二叉树的各种操作各种遍历,复制,求高度,判断是否为一棵完全二叉树以及计算用二叉树存储的表达式

    根据给定的信息,本文将详细介绍二叉树的基本概念及其在程序中的实现方法,包括二叉树的创建、遍历(前序、中序、后序)、复制、求高度、判断是否为完全二叉树以及利用二叉树进行表达式的计算等操作。 ### 一、...

    构造二叉树与遍历二叉树

    ### 构造二叉树与遍历二叉树 #### 一、二叉树的基本概念 二叉树(Binary Tree)是一种非线性数据结构,在计算机科学中被广泛应用于各种算法和程序设计中。一个二叉树由零个或多个节点组成,其中每个节点最多有两个子...

    按凹入表形式横向打印任意二叉树结构,即二叉树的根在屏幕的最左边,二叉树的左子树在屏幕的下边,二叉树的右子树在屏幕的上边。

    二叉树横向打印算法的实现 二叉树是一种基本的数据结构,在计算机科学和编程中广泛应用。本资源介绍了一种特殊的二叉树打印算法,即横向打印二叉树结构。该算法将二叉树的根节点放在屏幕的最左边,左子树在屏幕的...

    复制一棵二叉树

    ### 知识点:复制一棵二叉树 #### 一、引言 在计算机科学领域,数据结构中的二叉树是一种常见的非线性数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。复制二叉树是指创建一个与原...

    二叉树的递归算法:建立二叉树、遍历二叉树

    ### 二叉树的递归算法:建立与遍历 #### 一、二叉树的基本概念 二叉树是计算机科学中的一个重要数据结构,它是一种树形结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。在二叉树中,左子节点...

    二叉树的基本运算

    建立一棵二叉树,试编程实现二叉树的如下基本操作: 1. 按先序序列构造一棵二叉链表表示的二叉树T; 2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列; 3. 求二叉树的深度/结点数目...

    二叉树相关算法的实验验证+判别给定二叉树是否为完全二叉树。

    1、 定义链接存储的二叉树类。 2、 实验验证如下算法的正确性、各种功能及指标: 1) 创建一棵二叉树,并对其初始化; 2)先根、中根、后根遍历二叉树; 3) 在二叉树中搜索给定结点的父结点; 4) 搜索二叉树中符合...

    二叉树的建立与遍历

    二叉树的建立与遍历 二叉树是一种重要的数据结构,它广泛应用于计算机科学和软件工程中。在这篇文章中,我们将讨论二叉树的建立和遍历,包括先序遍历、中序遍历和后序遍历。 一、数据结构的重要性 数据结构是...

    二叉树_二叉树遍历_

    1.二叉树的基本操作实现【问题描述】建立一棵二叉树,用递归方法实现二叉树的如下基本操作:(1)按先序序列构造一棵二叉链表表示的二叉树T;(2)对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出...

    求二叉树最大宽度 求二叉树最大宽度 数据结构

    在探讨“求二叉树最大宽度”的数据结构问题时,我们深入分析了如何通过特定算法找到一棵二叉树中每一层节点的最大数量,这一过程涉及到了数据结构与算法设计的关键概念和技术。 ### 一、二叉树的概念 二叉树是一种...

    二叉树模拟器.py二叉树模拟器.py

    二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py...

    设计程序实现二叉树结点的类型定义和对二叉树的基本操作

    ### 二叉树基本操作知识点解析 #### 一、实验目的 在本实验中,学习者将通过实际编程练习来加深对二叉树这一数据结构的理解,并熟练掌握其基本操作。具体目标包括: 1. **熟悉二叉树结点的结构和对二叉树的基本...

    二叉树遍历实验报告

    ### 二叉树遍历实验报告知识点概览 #### 一、实验背景及目标 **实验背景:** 本次实验属于《数据结构》课程的一部分,旨在通过实际编程加深学生对二叉树这一数据结构的理解和应用能力。二叉树作为一种基本且重要的...

Global site tag (gtag.js) - Google Analytics