二叉树的非递归遍历(java实现)
2017-10-20 17:39
435 查看
二叉树的创建
树的定义
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * } */
二叉树的创建
public static TreeNode Create(){ String str=scan.next(); char c=str.charAt(0); TreeNode root; if(c=='^'){ root=null; }else{ root=new TreeNode(); root.val=c; root.left=Create(); root.right=Create(); } return root; }
树的遍历
树遍历的相关内容
(1)什么是二叉树的遍历? 指按某种规律对二叉树的每个结点进行访问且仅访问一次的过程。 (2)从另一个方面来说,遍历操作就是将二叉树中的结点按一定的规律进行线性化的操作,将非线性化结构变成线性化的访问序列。 (3)二叉树遍历的重要性? 二叉树遍历是对二叉树进行多种运算操作的基础。
前序非递归
下面两段代码虽然书写形式不同,但是实现功能是相同的。这两种写法对中序,后序遍历同样适用。
public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list=new ArrayList<Integer>(); Stack<TreeNode> stack=new Stack<TreeNode>(); TreeNode t=root; while(t!=null || stack.size()!=0){ while(t!=null){ list.add(t.val); stack.push(t); t=t.left; } if(stack.size()!=0){ TreeNode node=stack.pop(); t=node.right; } } return list; }
public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list=new ArrayList<Integer>(); Stack<TreeNode> stack=new Stack<TreeNode>(); TreeNode t=root; while(t!=null || stack.size()!=0){ if(t!=null){ list.add(t.val); stack.push(t); t=t.left; }else{ TreeNode node=stack.pop(); t=node.right; } } return list; }
中序非递归
public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list=new ArrayList<Integer>(); Stack<TreeNode> stack=new Stack<TreeNode>(); TreeNode t=root; while(t!=null || stack.size()!=0){ while(t!=null){ stack.push(t); t=t.left; } if(stack.size()!=0){ TreeNode node=stack.pop(); list.add(node.val); t=node.right; } } return list; }
后序非递归
//在后序遍历时,左右子树均访问完成后,从右子树返回时,上层结点才能退栈并被访问 public List<Integer> postorderTraversal(TreeNode root) { List<Integer> list=new ArrayList<Integer>(); Stack<TreeNode> stack=new Stack<TreeNode>(); TreeNode t=root; TreeNode now=null; //始终记录刚访问过的结点 while(t!=null || stack.size()!=0){ while(t!=null){ stack.push(t); t=t.left; } if(stack.size()!=0){ //当前的栈顶元素 TreeNode node=stack.peek(); if(node.right==null || node.right==now){ stack.pop(); list.add(node.val); now=node; }else{ t=node.right; } } } return list; }
层次遍历
public static void be(TreeNode root){ Queue<TreeNode> queue=new LinkedList<TreeNode>(); queue.offer(root); while(queue.size()!=0){ TreeNode node=queue.poll(); System.out.print(node.val); if(node.left!=null) queue.offer(node.left); if(node.right!=null) queue.offer(node.right); } }
复杂度的比较
算法类型 | 时间复杂度 | 空间复杂度 |
---|---|---|
递归 | 大于非递归 | 大于非递归 |
非递归 | O(n) | O(k) |
O(n):设有n个结点,访问每个结点的时间为常量级。 O(k):所需的栈空间和二叉树深度k成正比。
相关文章推荐
- Java实现二叉树的递归、非递归遍历
- Java实现二叉树的递归与非递归遍历
- Java实现二叉树后序非递归遍历(好理解)
- Java实现二叉树的三种非递归遍历
- Java实现二叉树的创建、递归/非递归遍历
- java中实现二叉树的非递归遍历
- java实现二叉树的非递归遍历与解析
- java实现二叉树的非递归遍历
- java实现二叉树的非递归遍历
- Java实现二叉树的创建、递归/非递归遍历
- 二叉树先序,中序,后序的非递归遍历(附java实现)
- 二叉树的递归与非递归遍历(Java描述)
- 转: 在JAVA中实现的二叉树结构
- java实现二叉树的常见操作
- java实现二叉树
- java 语言实现二叉树的各种操作
- 二叉树-链式存储-Java实现(未完待续)
- 二叉树Java实现
- Java二叉树的实现
- 用Java实现二叉树