二叉树的遍历(前序、中序、后序)

本文介绍二叉树的遍历方式,包括前序、中序和后序遍历。详细说明了三种遍历的顺序,还给出了递归和非递归实现的思路。前序是根 - 左 - 右,中序是左 - 根 - 右,后序是左 - 右 - 根,并分别阐述了非递归实现的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

供自己或有需要的朋友查询参考。如有错误请帮忙指明,谢谢。

 

二叉树的遍历有:

前序遍历:根结点 ---> 左子树 ---> 右子树

中序遍历:左子树---> 根结点 ---> 右子树

后序遍历:左子树 ---> 右子树 ---> 根结点

 

前序遍历

递归实现

public void preOrderTraverse(TreeNode root) {
    if (root != null) {
        System.out.print(root.val+"  ");
        preOrderTraverse(root.left);
        preOrderTraverse(root.right);
    }
}

非递归实现

思路:

对于任意结点。

1、把结点入栈,然后将当前结点置为左孩子。

2、判断结点是否为空,若为空,则取出栈顶结点并出栈,将右孩子置为当前结点;否则重复第一步直到当前结点为空或者栈为空。

public void preOrderTraverse(TreeNode root) {
    Stack<TreeNode> stack = new Stack<TreeNode>();
    TreeNode pNode = root;
    while (pNode != null || stack.size() > 0) {
        if (pNode != null) {
            System.out.print(pNode.val+"  ");
            stack.push(pNode);
            pNode = pNode.left;
        } else { 
            TreeNode node = stack.pop();
            pNode = node.right;
        }
    }
}

 

中序遍历

递归实现

public void inOrderTraverse(TreeNode root) {
    if (root != null) {
        inOrderTraverse(root.left);
        System.out.print(root.val+"  ");
        inOrderTraverse(root.right);
    }
}

非递归实现

思路:

1、首先将当前节点root的各个左子节点压入栈

2、然后依次从栈中取数据,进行打印,然后将当前节点置为栈顶的右孩子节点,回到1

3、如此循环直至栈为空

 

public void inOrderTraversal()
{
	Stack<TreeNode> stack=new Stack<TreeNode>();
	TreeNode node=root;
	while(node!=null || stack.size()>0)
	{
        while(node!=null)
        {
             stack.push(node);
            node=node.left;
        }
        
        if(stack.size()>0)
        {
            node=stack.pop();
            System.out.print(node.val+" ");
            node=node.right;
        }
	}
}

后序遍历

递归实现

public void postOrderTraverse(TreeNode root) {
    if (root != null) {
        postOrderTraverse(root.left);
        postOrderTraverse(root.right);
        System.out.print(root.val+"  ");
    }
}

非递归实现

思路:

1、首先将当前节点的各个右子节点进行入数据栈,同时将该节点的值压入一个值栈

2、然后依次从数据栈中取数据,将当前节点置为数据栈顶元素的左孩子节点,回到1

3、直至数据栈为空,此时再依次遍历值栈进行打印

 

public void postOrderTraversal()
{
	Stack<TreeNode> stack=new Stack<TreeNode>();
	Stack<Integer> valStack=new Stack<Integer>();
	TreeNode node=root;
	while(node!=null || stack.size()>0)
	{
        while(node!=null)
        {
            stack.push(node);
            valStack.push(node.val);
            node=node.right;
        }
        
        node=stack.pop();
        node=node.left;
	}
	
	while(valStack.size()>0)
	{
        System.out.print(valStack.pop()+" ");
	}
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值