二叉树的非递归实现
先序遍历(先根再左后右)
算法思想:
(1)先头节点入栈,并访问该节点
(2)循环遍历当前节点,直至左孩子没有节点
(3)查看当前节点是否有右孩子。若有,回到步骤(1)。若无,退出当前节点转入父节点遍历
#java
#定义二叉树的节点
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x){
val = x;
}
}
public List<Integer> preorderTraversal(TreeNode root){
List<Integer> li = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode cur = root;
while(cur!=null || !stack.isEmpty()){
while(cur!=null){
li.add(cur.val);
stack.push(cur);
cur=cur.left;
}
if(!stack.isEmpty){
cur=stack.pop();
cur = cur.right;
}
}
return li;
}
算法思想二:
遍历当前节点并访问,直至此节点无左孩子,在遍历过程中将当前节点的右孩子入栈。循环此过程。
public List<Integer> preorderTraversal(TreeNode root){
List<Integer> list = new ArrayList<Integer>();
Stack<TreeNode> rightstack = new Stack<TreeNode>();
TreeNode cur = root;
while(cur!=null){
list.add(cur.val);
if(cur.right!=null)
rightstack.push(cur.right);
cur = cur.left;
if(cur==null && !stack.isEmpty())
cur = rightstack.pop();
}
return list;
}
中序遍历(先左再中后右)
算法思想:
(1)从根节点开始顺着左孩子向下遍历直至左孩子为空,在此过程中将经过的节点依次入栈,此时的节点为最左节点。
(2)栈顶元素出栈访问最左节点,此时对该节点的右孩子进行中序遍历。
public <list> inorderTraversal(TreeNode root){
List<Integer> list = new ArrayList<Integer>();
Stack<TreeNode> rightstack = new Stack<TreeNode>();
TreeNode cur = root;
while(cur!=null || !stack.isEmpty()){
while(cur!=null){
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
li.add(cur.val);
cur = cur.right;
}
return li;
}