lintcode 算法-二叉树的遍历-前序遍历、中序遍历、后序遍历、层序遍历、深度遍历

算法要求

对于二叉树的遍历的方式就不介绍了。
分别是前序遍历、中序遍历、后序遍历、层序遍历、深度遍历
其中涉及到递归实现和非递归的实现方式。

      1
    /   \
   2     3
  / \   /  \
 4  5  6    7

二叉树节点为 1,2,3,4,5,6,7
前序遍历:1 2 4 5 3 6 7 
中序遍历:4 2 5 1 6 3 7
后序遍历:4 5 2 6 7 3 1
层次遍历:1 2 3 4 5 6 7
深度优先:1 2 4 5 3 6 7

1:前序遍历

非递归的方式实现

    /** 前序遍历 ,非递归的方式实现的
     * @param root
     * @return
     */
	public static List<Integer> preorderTraversal(TreeNode root) {
		List<TreeNode> p = new ArrayList<TreeNode>();
		List<Integer> res = new ArrayList<Integer>();
		while (root != null || p.size() != 0) {
			while (root != null) {
				p.add(root);
				res.add(root.val);
				root = root.left;
			}
			root = p.get(p.size() - 1);
			p.remove(p.size() - 1);
			root = root.right;
		}
		return res;
	}

递归实现方式1


	/** 前序遍历 ,递归的方式实现的
	 * @param root
	 * @return
	 */
	public static List<Integer> preorderTraversal2(TreeNode root) {
		if(root != null){
			resultList.add(root.val);
		}
		TreeNode left = root.left;
		if(left != null){
			preorderTraversal2(left);
		}
		TreeNode right = root.right;
		if(right != null){
			preorderTraversal2(right);
		}
		return resultList;
	}

递归实现方式2

	/**
	 * 前序遍历,递归的方式实现的
	 * @param root
	 * @return
	 */
	public static List<Integer> preorderTraversal3(TreeNode root) {
		if (root != null) {
			resultList.add(root.val);
			preorderTraversal3(root.left);
			preorderTraversal3(root.right);
		}
		return resultList;
	}

2:中序遍历

非递归实现方式

/** 中序遍历 ,非递归调用
	 * @param root
	 * @return
	 */
	public static List<Integer> inorderTraversal(TreeNode root) {
		List<TreeNode> p = new ArrayList<TreeNode>();
		List<Integer> res = new ArrayList<Integer>();
		while (root != null || p.size() != 0) {
			while (root != null) {
				p.add(root);
				root = root.left;
			}
			root = p.get(p.size() - 1);
			p.remove(p.size() - 1);
			res.add(root.val);
			root = root.right;
		}
		return res;
	}

递归实现方式1

/** 中序遍历 非递归调用
	 * @param root
	 * @return
	 */
	public static List<Integer> inorderTraversal2(TreeNode root) {
		TreeNode left = root.left;
		if(left != null){
			inorderTraversal2(left);
		}
		if(root!=null){
			resultList.add(root.val);
		}
		TreeNode right = root.right;
		if(right != null){
			inorderTraversal2(right);
		}
		return resultList;
	}

递归实现方式2

/**
	 * 中序遍历,递归的方式实现的
	 * @param root
	 * @return
	 */
	public static List<Integer> inorderTraversal3(TreeNode root) {
		if (root != null) {
			inorderTraversal3(root.left);
			resultList.add(root.val);
			inorderTraversal3(root.right);
		}
		return resultList;
	}

3:后序遍历

非递归实现方式

	/** 后序遍历 ,非递归调用
	 * @param root
	 * @return
	 */
	public static List<Integer> postorderTraversal(TreeNode root) {
		List<TreeNode> p = new ArrayList<TreeNode>();
		List<Integer> res = new ArrayList<Integer>();
		while (root != null || p.size() != 0) {
			while (root != null) {
				p.add(root);
				root = root.left;
			}
			root = p.get(p.size() - 1);
			res.add(root.val);
			p.remove(p.size() - 1);
			root = root.right;
		}
		return res;
	}

非递归实现方式2

    public static List<Integer> postorderTraversal1(TreeNode root){
        LinkedList<TreeNode> statck = new LinkedList<>();
        LinkedList<Integer> res = new LinkedList<>();
        if(root == null){
            return res;
        }
        statck.add(root);
        while (!statck.isEmpty()){
            TreeNode node = statck.pollLast(); // TODO 精髓的两句操作
            res.addFirst(node.val); // TODO res.add(node.val)   链表顺序是反着遍历的
            if(node.left != null){
                statck.add(node.left);
            }
            if(node.right != null){
                statck.add(node.right);
            }
        }
        return res;
    }

非递归实现方式3

    public static List<Integer> postorderTraversal2(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        LinkedList<Integer> res = new LinkedList<>();
        while (!stack.isEmpty() || root != null) {
            if (root != null) {
                stack.push(root);
                res.addFirst(root.val);
                root = root.right;
            } else {
                root = stack.pop();
                root = root.left;
            }
        }
        return res;
    }

递归实现方式1

/** 后序遍历 递归调用
	 * @param root
	 * @return
	 */
	public static List<Integer> postorderTraversal1(TreeNode root) {
		TreeNode left = root.left;
		if(left != null){
			postorderTraversal(left);
		}
		TreeNode right = root.right;
		if(right != null){
			postorderTraversal(right);
		}
		if(root!=null){
			resultList.add(root.val);
		}
		return resultList;
	}

递归实现方式2

/**
	 * 后序遍历,递归的方式实现的
	 * @param root
	 * @return
	 */
	public static List<Integer> postorderTraversal2(TreeNode root) {
		if (root != null) {
			postorderTraversal2(root.left);
			postorderTraversal2(root.right);
			resultList.add(root.val);
		}
		return resultList;
	}

4: 层序遍历

/**
	 * 层次遍历
	 */
	public static List<Integer> levelTraverse(TreeNode root){
		if(root == null){
			return null;
		}
		LinkedList<TreeNode> queue = new LinkedList<>();
		queue.offer(root);
		while(!queue.isEmpty()){
			TreeNode node = queue.poll();
			resultList.add(node.val);
			if(node.left != null){
				queue.offer(node.left);
			}
			if(node.right != null){
				queue.offer(node.right);
			}
		}
		return resultList;
	}

5:深度遍历

/**
	 * 深度优先遍历方式
	 * @param root
	 * @return
	 */
	public static List<Integer> depthTraversal(TreeNode root){
		if(root == null){
			return null;
		}
		Stack<TreeNode> stack = new Stack<TreeNode>();
		stack.push(root);
		while(!stack.isEmpty()){
			TreeNode node = stack.pop();
			resultList.add(node.val);
			if(node.right!=null){
				stack.push(node.right);
			}
			if(node.left != null){
				stack.push(node.left);
			}
		}
		return resultList;
	}

6:所有的代码和测试案例

package com.lintcode.easy;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

import com.lintcode.node.TreeNode;

/**  
 * 66. 二叉树的前序遍历
给出一棵二叉树,返回其节点值的前序遍历。

样例
Example 1:

Input:{1,2,3}
Output:[1,2,3]
解释:
前序遍历
Example 2:

Input:{1,#,2,3}
Output:[1,2,3]
解释:
前序遍历
挑战
你能使用非递归实现么?

注意事项
首个数据为根节点,后面接着是其左儿子和右儿子节点值,"#"表示不存在该子节点。
节点数量不超过20

      1
    /   \
   2     3
  / \   /  \
 4  5  6    7

二叉树节点为 1,2,3,4,5,6,7
前序遍历:1 2 4 5 3 6 7 
中序遍历:4 2 5 1 6 3 7
后序遍历:4 5 2 6 7 3 1
层次遍历:1 2 3 4 5 6 7
深度优先:1 2 4 5 3 6 7
 * @author zhouwenchen@021.com  
 * @date 2019年3月27日上午11:43:56   
 */
public class PreorderTraversal {
	
	private static List<Integer> resultList = new ArrayList<Integer>();
	private static List<List<Integer>> resultList1 = new ArrayList<>();
	
    /** 前序遍历 ,非递归的方式实现的
     * @param root
     * @return
     */
	public static List<Integer> preorderTraversal(TreeNode root) {
		List<TreeNode> p = new ArrayList<TreeNode>();
		List<Integer> res = new ArrayList<Integer>();
		while (root != null || p.size() != 0) {
			while (root != null) {
				p.add(root);
				res.add(root.val);
				root = root.left;
			}
			root = p.get(p.size() - 1);
			p.remove(p.size() - 1);
			root = root.right;
		}
		return res;
	}
	
	/** 前序遍历 ,递归的方式实现的
	 * @param root
	 * @return
	 */
	public static List<Integer> preorderTraversal2(TreeNode root) {
		if(root != null){
			resultList.add(root.val);
		}
		TreeNode left = root.left;
		if(left != null){
			preorderTraversal2(left);
		}
		TreeNode right = root.right;
		if(right != null){
			preorderTraversal2(right);
		}
		return resultList;
	}
	
	/**
	 * 前序遍历,递归的方式实现的
	 * @param root
	 * @return
	 */
	public static List<Integer> preorderTraversal3(TreeNode root) {
		if (root != null) {
			resultList.add(root.val);
			preorderTraversal3(root.left);
			preorderTraversal3(root.right);
		}
		return resultList;
	}
	
	// TODO ===========================
	/** 中序遍历 ,非递归调用
	 * @param root
	 * @return
	 */
	public static List<Integer> inorderTraversal(TreeNode root) {
		List<TreeNode> p = new ArrayList<TreeNode>();
		List<Integer> res = new ArrayList<Integer>();
		while (root != null || p.size() != 0) {
			while (root != null) {
				p.add(root);
				root = root.left;
			}
			root = p.get(p.size() - 1);
			p.remove(p.size() - 1);
			res.add(root.val);
			root = root.right;
		}
		return res;
	}
	
	/** 中序遍历 非递归调用
	 * @param root
	 * @return
	 */
	public static List<Integer> inorderTraversal2(TreeNode root) {
		TreeNode left = root.left;
		if(left != null){
			inorderTraversal2(left);
		}
		if(root!=null){
			resultList.add(root.val);
		}
		TreeNode right = root.right;
		if(right != null){
			inorderTraversal2(right);
		}
		return resultList;
	}
	
	/**
	 * 中序遍历,递归的方式实现的
	 * @param root
	 * @return
	 */
	public static List<Integer> inorderTraversal3(TreeNode root) {
		if (root != null) {
			inorderTraversal3(root.left);
			resultList.add(root.val);
			inorderTraversal3(root.right);
		}
		return resultList;
	}
	
	// TODO ===========================
	
	/** 后序遍历 ,非递归调用
	 * @param root
	 * @return
	 */
	public static List<Integer> postorderTraversal(TreeNode root) {
		List<TreeNode> p = new ArrayList<TreeNode>();
		List<Integer> res = new ArrayList<Integer>();
		while (root != null || p.size() != 0) {
			while (root != null) {
				p.add(root);
				root = root.left;
			}
			root = p.get(p.size() - 1);
			res.add(root.val);
			p.remove(p.size() - 1);
			root = root.right;
		}
		return res;
	}
	
	/** 后序遍历 递归调用
	 * @param root
	 * @return
	 */
	public static List<Integer> postorderTraversal1(TreeNode root) {
		TreeNode left = root.left;
		if(left != null){
			postorderTraversal(left);
		}
		TreeNode right = root.right;
		if(right != null){
			postorderTraversal(right);
		}
		if(root!=null){
			resultList.add(root.val);
		}
		return resultList;
	}
	
	/**
	 * 后序遍历,递归的方式实现的
	 * @param root
	 * @return
	 */
	public static List<Integer> postorderTraversal2(TreeNode root) {
		if (root != null) {
			postorderTraversal2(root.left);
			postorderTraversal2(root.right);
			resultList.add(root.val);
		}
		return resultList;
	}
	
	// TODO ===========================
	
	/**
	 * 层次遍历
	 */
	public static List<Integer> levelTraverse(TreeNode root){
		if(root == null){
			return null;
		}
		LinkedList<TreeNode> queue = new LinkedList<>();
		queue.offer(root);
		while(!queue.isEmpty()){
			TreeNode node = queue.poll();
			resultList.add(node.val);
			if(node.left != null){
				queue.offer(node.left);
			}
			if(node.right != null){
				queue.offer(node.right);
			}
		}
		return resultList;
	}
 
	// TODO =======================================
	/**
	 * 深度优先遍历方式
	 * @param root
	 * @return
	 */
	public static List<Integer> depthTraversal(TreeNode root){
		if(root == null){
			return null;
		}
		Stack<TreeNode> stack = new Stack<TreeNode>();
		stack.push(root);
		while(!stack.isEmpty()){
			TreeNode node = stack.pop();
			resultList.add(node.val);
			if(node.right!=null){
				stack.push(node.right);
			}
			if(node.left != null){
				stack.push(node.left);
			}
		}
		return resultList;
	}
	
	/**
	 * 深度优先遍历,递归方式实现
	 * @param root
	 * @return
	 */
	public static List<Integer> depthTraversal1(TreeNode root){
		if(root == null){
			return null;
		}
		resultList.add(root.val);
		depthTraversal1(root.left);
		depthTraversal1(root.right);
		return resultList;
	}
	
	
    public static void main(String[] args) {
    	TreeNode node1 = new TreeNode(1);
		TreeNode node2 = new TreeNode(2);
		TreeNode node3 = new TreeNode(3);
		TreeNode node4 = new TreeNode(4);
		TreeNode node5 = new TreeNode(5);
		TreeNode node6 = new TreeNode(6);
		TreeNode node7 = new TreeNode(7);
		
//		TreeNode node8 = new TreeNode(8);

		node1.left = node2;
		node1.right = node3;
		node2.left = node4;
		node2.right = node5;
		node3.left = node6;
		node3.right = node7;
		
//		node7.right = node8;
//		List<Integer> list = inorderTraversal(node1);
//		List<Integer> list = inorderTraversal(node1);
// 		List<Integer> list = preorderTraversal3(node1);
// 		List<Integer> list = postorderTraversal(node1);
// 		List<Integer> list = levelTraverse(node1);
 		List<Integer> list = depthTraversal(node1);
		for (Integer integer : list) {
			System.out.print(integer + " ");
		}
	}
}

public class TreeNode {
	public int val;
	public TreeNode left, right;

	public TreeNode(int val) {
		this.val = val;
		this.left = this.right = null;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值