二叉树的遍历-(递归法)和(非递归法)

硅谷探秘者 5314 0 0

整理 二叉树的遍历-(递归法)和(非递归法)-笔记

先序遍历、中序遍历、后续遍历、层级遍历。

1.节点信息:

package tree;
public class Node<E> {
	private E e;//数据域
	private Node<E> left;//左子树
	private Node<E> right;//右子树
	private boolean b =true;//标记是否遍历
	public Node(E e) {
		super();
		this.e = e;
	}
	public E getE() {
		return e;
	}
	public void setE(E e) {
		this.e = e;
	}
	public Node<E> getLeft() {
		return left;
	}
	public void setLeft(Node<E> left) {
		this.left = left;
	}
	public Node<E> getRight() {
		return right;
	}
	public void setRight(Node<E> right) {
		this.right = right;
	}
	public boolean getB() {
		return b;
	}
	public void setB(boolean b) {
		this.b = b;
	}
	
}


2.构造二叉树以及遍历操作:

package tree;
import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
 * 二叉树的遍历
 * @author Administrator
 *
 */
public class Tree {
	private Node<Integer> head;
	public Tree(){
	}
	/**
	 * 添加节点
	 * @param e
	 * @return
	 */
	public boolean addNode(Integer e){
		if(head==null){//空树
			head=new Node<Integer>(e);
			return true;
		}else{//非空
			Node<Integer> n=head;
			do{
				Integer a=n.getE();
				if(e>=a){
					if(n.getRight()==null){
						Node<Integer> node=new Node<Integer>(e);
						n.setRight(node);
						return true;
					}else{
						n=n.getRight();
					}
				}else{
					if(n.getLeft()==null){
						Node<Integer> node=new Node<Integer>(e);
						n.setLeft(node);
						return true;
					}else{
						n=n.getLeft();
					}
				}
			}while(n!=null);
		}
		return false;
	}
	/**
	 * 先序遍历(递归法)
	 */
	public void preErgodic(){
		pre(head);
		System.out.println();
	}
	private void pre(Node<Integer> node){
		if(node==null){
			return;
		}
		System.out.print(node.getE()+"  ");
		pre(node.getLeft());
		pre(node.getRight());
	}
	
	/**
	 * 中序遍历(递归法)
	 */
	public void midErgodic(){
		mid(head);
		System.out.println();
	}
	private void mid(Node<Integer> node){
		if(node==null){
			return;
		}
		mid(node.getLeft());
		System.out.print(node.getE()+"  ");
		mid(node.getRight());
	}
	
	/**
	 * 后续遍历(递归法)
	 */
	public void subErgodic(){
		sub(head);
		System.out.println();
	}
	private void sub(Node<Integer> node){
		if(node==null){
			return;
		}
		sub(node.getLeft());
		sub(node.getRight());
		System.out.print(node.getE()+"  ");
	}
	
	/**
	 * 先序遍历(非递归,基于栈)
	 */
	public void _preErgodic(){
		if(head==null){
			return;
		}
		Stack<Node<Integer>> stack=new Stack<>();
		Node<Integer> node=head;
		stack.push(node);
		while(!stack.isEmpty()){
			Node<Integer> n=stack.pop();
			System.out.print(n.getE()+"  ");
			if(n.getRight()!=null){
				stack.push(n.getRight());
			}
			if(n.getLeft()!=null){
				stack.push(n.getLeft());
			}
		}
		System.out.println();
	}
	
	/**
	 * 中序遍历(非递归,基于栈)
	 */
	public void _midErgodic(){
		if(head==null){
			return;
		}
		Stack<Node<Integer>> stack=new Stack<>();
		Node<Integer> n=head;
		operation(n, stack);
		while(!stack.isEmpty()){
			n=stack.pop();
			System.out.print(n.getE()+"  ");
			if(n.getRight()!=null){
				operation(n.getRight(),stack);
			}
		}
		System.out.println();
	}
	private void operation(Node<Integer> n,Stack<Node<Integer>> s){
		s.push(n);
		while(n.getLeft()!=null){
			s.push(n.getLeft());
			n=n.getLeft();
		}
	}
	
	/**
	 * 后序遍历(非递归,基于栈)
	 */
	public void _subErgodic(){
		if(head==null){
			return;
		}
		Stack<Node<Integer>> stack=new Stack<>();
		Node<Integer> n=head;
		stack.push(n);
		boolean b=true;
		while(!stack.isEmpty()){
			n=stack.peek();
			if(n.getRight()!=null&&n.getRight().getB()){
				stack.push(n.getRight());
				b=false;
			}
			if(n.getLeft()!=null&&n.getLeft().getB()){
				stack.push(n.getLeft());
				b=false;
			}
			if(b){
				n=stack.pop();
				System.out.print(n.getE()+"  ");
				n.setB(false);
			}
			b=true;
		}
		System.out.println();
	}
	
	public void hieErgodic(){
		if(head==null){
			return;
		}
		Queue<Node<Integer>> q=new ConcurrentLinkedQueue<Node<Integer>>();
		Node<Integer> n=head;
		q.add(n);
		while(!q.isEmpty()){
			n=q.poll();
			System.out.print(n.getE()+"  ");
			if(n.getLeft()!=null){
				q.add(n.getLeft());
			}
			if(n.getRight()!=null){
				q.add(n.getRight());
			}
		}
	}
}


3.测试:

package tree;

public class TestMain {
	public static void main(String[] args) {
		Tree tree=new Tree();
		tree.addNode(10);
		tree.addNode(5);
		tree.addNode(20);
		tree.addNode(2);
		tree.addNode(4);
		tree.addNode(15);
		tree.addNode(25);
		tree.addNode(0);
		tree.addNode(1);
		tree.addNode(3);
		tree.addNode(12);
		tree.addNode(16);
		
		System.out.print("先序遍历(递    归):");
		tree.preErgodic();
		System.out.print("中序遍历(递    归):");
		tree.midErgodic();
		System.out.print("后序遍历(递    归):");
		tree.subErgodic();
		
		System.out.println();
		
		System.out.print("先序遍历(非递归):");
		tree._preErgodic();
		
		System.out.print("中序遍历(非递归):");
		tree._midErgodic();
		
		System.out.print("后序遍历(非递归):");
		tree._subErgodic();
		
		System.out.println();
		
		System.out.print("层级遍历:");
		tree.hieErgodic();
		
	}
}

image.png



评论区
请写下您的评论...
暂无评论...
猜你喜欢
official 1059 leetcode第589题题目描述给定一个N,返回其节点值前序。例如,给定一个3:返回其前序:[1,3,5,6,2,4]。解题思路,深度优先搜索代码(java
数据结构与算法 1513 思想该算使用实现,思路为:每次将待排序数组在中间位置分成左右两组,分别对左右两个数组进行并排序,条件是数组长度必须大于等于3,所以当数组中只有两个数据时候可以直接进行比较排
数据结构与算法 4018 题目:在一个有序数组中查找指定数,如果存在返回其数组下标,否则返回-1packagetest;/*** 分查找*@author硅谷探秘者(jia)*/publicclassTestMain2
数据结构与算法 5071 实现全排列算c++描述#includeiostreamusingnamespacestd;//交换voidexchange(int*a,inti,intj){if(i==j){return
数据结构与算法 8385 )java代码实现importjava.util.LinkedList;/***结点类*@author硅谷探秘者(jia)*/classNode{ publicintdata; publicNodele
official 1227 径。说明:叶子节点是指没有子节点节点。示例:输入:1/\23\5输出:["1-2-5","1-3"]解释:所有根节点到叶子节点路径为:1-2-5,1-3解题思路得方式(深度优先搜索),
数据结构与算法 4600 实现合并两增链表-合并后保持增序列java描述数据结构:单链表算链表节点packageclub.test;/****链表节点*@authorjiajia
数据结构与算法 2530 ; publicNode(intvalue,Nodenext){ super(); this.value=value; this.next=next; }}算实现packageclub.test;/***
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1 2024-08  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript 加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。