java二叉树堆栈遍历_非递归中序遍历二叉树java实现

下面给大家分享的是一个使用非递归的方法,中序遍历二叉树的实例,对于这个方面感兴趣的朋友可以来了解一下哦。

要求:

非递归,中序遍历二叉树。

分析:

前序遍历,这里可以用一个栈来模拟一下操作,首先的话先将root压栈,每一次从堆栈当中弹出栈顶元素,就表示当前访问的元素,对其进行打印,依次判断,它的右子树和左子树是否非空,并进行压栈操作,先压栈右子树。

那么为什么要先压栈右子树呢?

这里的话主要就是因为先压栈的后弹出,左子树需要先访问,所以,左子树就后压栈。

中序遍历和后序遍历就要更加的复杂一些。

代码:public class Solution

{

// 非递归中序遍历

public List  inorderTraversal(TreeNode root)

{

List  res = new ArrayList  ();

IF(root == null)

{

return res;

}

Stack  stack = new Stack  ();

TreeNode p = root;

while (p != null || !stack.isEmpty())

{

if (p != null)

{

stack.push(p);

p = p.left;

}

else

{

p = stack.pop();

res.add(p.val);

p = p.right;

}

}

return res;

}

// 非递归后序遍历

public List  postorderTraversal(TreeNode root)

{

List  res = new ArrayList  ();

if (root == null)

{

return res;

}

Stack  stack = new Stack  ();

TreeNode p = root;

// 标记最近出栈的节点,用于判断是否是p节点的右孩子,如果是的话,就可以访问p节点

TreeNode pre = p;

while (p != null || !stack.isEmpty())

{

if (p != null)

{

stack.push(p);

p = p.left;

}

else

{

p = stack.pop();

if (p.right == null || p.right == pre)

{

res.add(p.val);

pre = cur;

p = null;

}

else

{

stack.push(p);

p = p.right;

stack.push(p);

p = p.left;

}

}

}

return res;

}

// 非递归层次遍历

public List  levelTraversal(TreeNode root)

{

List  res = new ArrayList  ();

if (root == null)

{

return res;

}

Queue  queue = new LinkedList  ();

q.add(root);

while (!queue.isEmpty())

{

// current node

TreeNode current = queue.remove();

res.add(current.val);

if (current.left != null)

{

queue.add(current.left);

}

if (current.right != null)

{

queue.add(current.right);

}

}

return res;

}

}

以上内容源于网络,仅供参考,希望可以对你有所帮助。

假如,你还想了解更多的java实例,可以继续的关注奇Q工具网,有更多经典实例可以为你分享。

推荐阅读:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值