zoukankan      html  css  js  c++  java
  • java创建二叉树并递归遍历二叉树

    二叉树类代码:

    package binarytree;
    
    import linkqueue.LinkQueue;
    
    public class BinaryTree {
    
    	class Node
    	{
    		public Object data;
    		public Node lchild;
    		public Node rchild;
    		
    		public Node(Object data)
    		{
    			this.data = data;
    			this.lchild = null;
    			this.rchild = null;
    		}
    	}
    
    	//根节点
    	private Node root = null;
    	private Node node = null;
    	/**
    	 * 创建树
    	 * 
    	 * 以完全二叉树的格式来创建(子树不存在的用0填充),
    	 * 对完全二叉树中每一个节点从0开始进行编号,
    	 * 那么第i个节点的左孩子的编号为2*i+1,右孩子为2*i+2。
    	 * 
    	 * */
    	void createTree(String strtree)
    	{
    		LinkQueue lQueue = new LinkQueue();
    		lQueue.initQueue();
    		/**
    		 * 完全二叉树中第i层的结点的个数最多为第1到i-1层上所有节点的个数和
    		 * 所以父节点的个数最多为N-1个,N表示节点个数
    		 * */
    		for(int parentIndex =0; parentIndex<strtree.split(" ").length/2;parentIndex++)
    		{
    			if(root == null)
    			{
    				root= new Node(strtree.split(" ")[parentIndex]);
    				//左孩子
    				root.lchild = new Node(strtree.split(" ")[parentIndex*2+1]);
    				lQueue.enQueue(root.lchild);
    				//右孩子
    				root.rchild = new Node(strtree.split(" ")[parentIndex*2+2]);
    				lQueue.enQueue(root.rchild);
    			}else
    			{
    				if(!lQueue.isEmpty() && parentIndex*2+1<strtree.split(" ").length)//队列不空
    				{
    					node = (Node) lQueue.deQueue();
    					if(parentIndex*2+1<strtree.split(" ").length)
    					{
    						//左孩子
    						node.lchild = new Node(strtree.split(" ")[parentIndex*2+1]);
    						lQueue.enQueue(node.lchild);
    					}
    					if(parentIndex*2+2<strtree.split(" ").length)
    					{
    						//右孩子
    						node.rchild = new Node(strtree.split(" ")[parentIndex*2+2]);
    						lQueue.enQueue(node.rchild);
    					}
    				}else
    				{
    					return;
    				}
    			}
    		}
    	}
    	
    	/**
    	 * 先序遍历二叉树
    	 * */
    	void preOrderTraverse(Node node)
    	{
    		if(node == null)
    		{
    			return;
    		}
    		visit(node);
    		preOrderTraverse(node.lchild);
    		preOrderTraverse(node.rchild);
    	}
    	/**
    	 * 中序遍历二叉树
    	 * */
    	void inOrderTraverse(Node node)
    	{
    		if(node == null)
    		{
    			return;
    		}
    		inOrderTraverse(node.lchild);
    		visit(node);
    		inOrderTraverse(node.rchild);
    	}
    	/**
    	 * 后序遍历二叉树
    	 * */
    	void postOrderTraverse(Node node)
    	{
    		if(node == null)
    		{
    			return;
    		}
    		postOrderTraverse(node.lchild);
    		postOrderTraverse(node.rchild);
    		visit(node);
    	}
    
    	/**
    	 * 打印二叉树
    	 * */
    	public void print()
    	{
    		System.out.print("先序遍历:");
    		preOrderTraverse(root);
    		System.out.print("
    中序遍历:");
    		inOrderTraverse(root);
    		System.out.print("
    后序遍历:");
    		postOrderTraverse(root);
    	}
    	
    	/**
    	 * 访问节点
    	 * */
    	private void visit(Node node)
    	{
    		if(!node.data.equals("0"))
    		{
    			System.out.print(node.data+" ");
    		}
    	}
    }
    

    测试代码(以数据结构中表达式a+b*(c-d)-e/f为例):

    package binarytree;
    
    public class BinaryTreeMain {
    
    	public static void main(String[] args) {
    		BinaryTree binaryTree = new BinaryTree();
    		
    		String strtree="- + / a * e f 0 0 b - 0 0 0 0 0 0 0 0 0 0 c d";//0表示没有值的位置
    		binaryTree.createTree(strtree);
    		
    		binaryTree.print();
    	}
    
    }
    

     运行结果:

  • 相关阅读:
    mysql query insert中文乱码
    git rebase
    ubuntu下怎么合并windows下分割的zip包
    [Matlab]双线性变换法设计数字带阻滤波器
    [Matlab]双线性变换法设计数字带通滤波器
    [Matlab]双线性变换法设计数字高通滤波器
    [Matlab]双线性变换法设计数字低通滤波器
    [Matlab]四种IIR滤波器纹波特性对比
    [Matlab]椭圆滤波器设计:低通、高通、带通和带阻
    [Matlab]切比雪夫Ⅱ型滤波器设计:低通、高通、带通和带阻
  • 原文地址:https://www.cnblogs.com/lixiaolun/p/4658659.html
Copyright © 2011-2022 走看看