• 二叉树的遍历(递归与非递归)


    节点类 Node.java

    package com.shundong.btree;
    /**
     * 链式二叉树节点
     * @author shundong106
     *
     */
    public class Node {
    	Object value;
    	Node leftChild;
    	Node rightChild;
    	public Node(int value) {
    		super();
    		this.value = value;
    	}
    	public Node(int value, Node leftChild, Node rightChild) {
    		super();
    		this.value = value;
    		this.leftChild = leftChild;
    		this.rightChild = rightChild;
    	}
    	
    }
    

     方法一 递归 

    package com.shundong.btree;
    /**
     * 方法1 递归
     * @author shundong106
     *
     */
    public class TraversalOfBinaryTree {
    	private Node root;//根节点
    
    	public TraversalOfBinaryTree() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    	public TraversalOfBinaryTree(Node root) {
    		super();
    		this.root = root;
    	}
    	//二叉树先序遍历
    	public void preorderTraversal() {
    		System.out.print("先根遍历");
    		this.preorderTraversal(root);
    		System.out.println();
    	}
    	//先序遍历的辅助函数
    	private void preorderTraversal(Node root) {
    		if(root !=null) {
    			//输出根
    			System.out.print(root.value+" ");
    			//遍历根的 左子树
    			this.preorderTraversal(root.leftChild);
    			//遍历根的 右子树
    			this.preorderTraversal(root.rightChild);
    		}
    	}
    	//二叉树中序遍历
    	public void inOrderTraversal() {
    		System.out.print("中序遍历");
    		this.inOrderTraversal(root);
    		System.out.println();
    	}
    	private void inOrderTraversal(Node root) {
    		if(root !=null) {
    			//先输出左子树
    			this.inOrderTraversal(root.leftChild);
    			//输出根
    			System.out.print(root.value+" ");
    			//再输出右子树
    			this.inOrderTraversal(root.rightChild);
    		}
    	}
    	//二叉树的后根遍历
    	public void postOrderTraversal() {
    		System.out.print("后根遍历");
    		this.postOrderTraversal(root);
    		System.out.println();
    	}
    	private void postOrderTraversal(Node root) {
    		if(root !=null) {
    			//先遍历左子树
    			this.postOrderTraversal(root.leftChild);
    			//在输出右子树
    			this.postOrderTraversal(root.rightChild);
    			//再输出根
    			System.out.print(root.value+" ");
    		}
    	}
    }
    

      方法二 非递归(栈)

    package com.shundong.btree;
    
    import java.util.Deque;
    import java.util.LinkedList;
    
    /**
     * !递归
     * @author shundong106
     *
     */
    public class TraversalOfBinaryTree2 {
    	private Node root;//根节点
    
    	public TraversalOfBinaryTree2() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    	public TraversalOfBinaryTree2(Node root) {
    		super();
    		this.root = root;
    	}
    	//二叉树先序遍历 非递归
    	public void preOrderTraversal() {
    		System.out.print("先根遍历");
    		this.preOrderTraversal(root);
    		System.out.println();
    	}
    	//先序遍历的辅助函数
    	private void preOrderTraversal(Node root) {
    		//创建一个栈
    		Deque<Node> stack = new LinkedList<Node>(); 
    		while (root != null || !stack.isEmpty()) {    
    			while (root != null) {    
    				//先直接输出 根节点
    				System.out.print(root.value+" ");    
    				stack.push(root);//将根节点入栈
    				root = root.leftChild;//将当前根节点的做孩子 当做新的 根节点
    			}    
    			if (!stack.isEmpty()) {    
    				root = stack.pop();    
    				root = root.rightChild;
    			}    
    		}    
    	}
    	//二叉树中序遍历递归
    	public void inOrderTraversal() {
    		System.out.print("中序遍历");
    		this.inOrderTraversal(root);
    		System.out.println();
    	}
    	private void inOrderTraversal(Node root) {
    		//创建一个栈
    		Deque<Node> stack = new LinkedList<Node>();
    		//将根节点 赋值
    		Node current = root ;
    		while(current !=null || !stack.isEmpty()) {
    			while(current !=null) {
    				stack.push(current);//让根进栈 
    				current = current.leftChild;//然后再遍历左子树 只有到达二叉树的左叶子 才会终止循环
    			}
    			//此刻若栈不为空 那么栈顶必定是 根节点
    			if(!stack.isEmpty()) {
    				current = stack.pop();//输出当前的栈顶 也就是 左叶子节点
    				System.out.print(current.value+" ");
    				current = current.rightChild;//然后此刻开始遍历右子树
    			}
    		}
    	}
    	//二叉树的后根遍历
    	public void postOrderTraversal() {
    		System.out.print("后根遍历");
    		this.postOrderTraversal(root);
    		System.out.println();
    	}
    	private void postOrderTraversal(Node root) {
    		Deque<Node> stack = new LinkedList<Node>(); 
    		Deque<Integer> stack2 = new LinkedList<Integer>();    
            Integer i = new Integer(1);    
            while (root != null || !stack.isEmpty()) {    
                while (root != null) {    
                    stack.push(root);    
                    stack2.push(new Integer(0));    
                    root = root.leftChild;    
                }    
                while (!stack.isEmpty() && stack2.peek().equals(i)) {    
                    stack2.pop();    
                    System.out.print(stack.pop().value +" ");    
                }    
        
                if (!stack.isEmpty()) {    
                    stack2.pop();    
                    stack2.push(new Integer(1));    
                    root = stack.peek();    
                    root = root.rightChild; 
                }    
            }    
    	}
    }
    

      

    测试类 Test.java

    package com.shundong.btree;
    /**
     * 二叉树遍历的测试类
     * @author shundong
     *
     */
    public class Test {
    	public static void main(String[] args) {
    		Node node5 = new Node(5,null,null);
    		Node node4 = new Node(4,null,node5);
    		Node node7 = new Node(7,null,null);
    		Node node6 = new Node(6,null,node7);
    		Node node3 = new Node(3,null,null);
    		Node node2 = new Node(2, node3, node6);
    		Node node1 = new Node(1, node4, node2);//根节点
    		TraversalOfBinaryTree btree = new TraversalOfBinaryTree(node1);
    		//先根遍历
    		btree.preorderTraversal();
    		//中根遍历
    		btree.inOrderTraversal();
    		//后根遍历
    		btree.postOrderTraversal();
    		System.out.println("-------------------------非递归——————————————————————");
    		TraversalOfBinaryTree2 btree2 = new TraversalOfBinaryTree2(node1);
    		btree2.preOrderTraversal();
    		btree2.inOrderTraversal();
    		btree2.postOrderTraversal();
    	
    	}
    }
    

      

      

  • 相关阅读:
    RF操作execl
    fiddler 设置代理以后不能访问网络的解决办法
    Eclipse没有Web插件和JavaEE插件咋整
    mysql 分页查询的标准写法
    java读写操作
    java 链接mysql
    关于博客
    响应式排版中的基础知识
    前端性能优化最佳实践
    HTTP必知必会
  • 原文地址:https://www.cnblogs.com/shundong106/p/9831764.html
Copyright © 2020-2023  润新知