构造 二叉排序树 的算法 (不知道对错,如果错,请回复纠正,谢谢)

一杯JAVA浓 做棵大树 6年前 (2017-12-20) 2326次浏览 0个评论

首先我创建了两个类,一个是节点类  Node.java,一个是ShiYan7.java。以下附上两个类的代码

Node.java

	//定义节点类
 public class Node                             //单链表结点类,T 指定结点的元素类型
    {
        public int data;                               //数据域,存储数据元素
        public Node left;						 //地址域,引用前驱结点
        public Node right;                         //地址域,引用后继结点

        public Node(int data, Node left,Node right)            //构造结点,data 指定数据元素,next 指定后继结点
        {
            this.data = data;                        //T 对象引用赋值
            this.left = left;
            this.right = right;                        //Node 对象引用赋值
        }
        
        public Node() {
			super();
		}
        
        
		public String toString()                     //返回结点数据域的描述字符串
        {
            return Integer.toString(this.data);
        }

		public int getData() {
			return data;
		}

		public void setData(int data) {
			this.data = data;
		}

		public Node getLeft() {
			return left;
		}

		public void setLeft(Node left) {
			this.left = left;
		}

		public Node getRight() {
			return right;
		}

		public void setRight(Node right) {
			this.right = right;
		}
		
		
        
    }


ShiYan7.java

import java.util.Queue;
//构造二叉判定树
public class ShiYan7 {
    static int counter = 0;										//定义一个静态计数变量

    public static Node createBiTree(Node root, int[] a, int i) {
        if (i < a.length) {										//判断是否溢出
                root.data = a[i];								//设定 root 的 data 值
            if (i == 0) {										//判定是否是第一个元素
            	if (a[0]<a[1]) { Node rchild = new Node(); root.right = createBiTree(rchild, a, ++counter); } if (a[0]>a[1]) {
					Node lchild = new Node();						//如果小,则是前一个节点的左节点
					root.left = createBiTree(lchild, a, ++counter);
				}
			}else{
	            if (counter!=a.length-1 && root.data < a[i+1]) { //排除 i+1 越界的情况 Node rchild = new Node(); root.right = createBiTree(rchild, a, ++counter); } else if(counter!=a.length-1 && root.data >= a[i+1]){
	            	Node lchild = new Node();						//如果小,则是前一个节点的左节点
					root.left = createBiTree(lchild, a, ++counter);
	            }
			}
        }
        return root;
    }

    // 访问节点
    public static void visitTNode(Node node) {
        System.out.print(node.data + " ");
    }

    // 层次遍历
    public static void levelTraverse(Node root) {
        Queue queue = new LinkedList();
        queue.offer(root);								// 从根节点入队列
        while (!queue.isEmpty()) {						// 在队列为空前反复迭代
            Node bitNode = queue.poll();				// 取出队列首节点
            visitTNode(bitNode);
            if (bitNode.left != null)
                queue.offer(bitNode.left);				// 左孩子入列
            
            if (bitNode.right != null)
                queue.offer(bitNode.right);				// 右孩子入列
        }
    }
public static void main(String[] args) {
        int[] a = {1,2,5,15,10,85,23,4};
        Node root = new Node();
        root = createBiTree(root, a, counter);
        levelTraverse(root);
}
}

上边的即是我的代码,如果有错误,请在下方评论纠正,算法未作优化,但是这个方法构造一棵树还是可以的哈~


做棵大树 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明构造 二叉排序树 的算法 (不知道对错,如果错,请回复纠正,谢谢)
喜欢 (2)
[欢迎投币]
分享 (0)
关于作者:
一个整天无所事事的,有时候忽然热血的孩子
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址