一般用递归的方式遍历树,非递归的方式比较复杂,可以利用栈辅助实现。
前序遍历
根–>左子树–>右子树
递归:
public void preOrder(TreeNode node)
{
if(node!=null){
System.out.println(node.val);
PreOrder(node.left);
PreOrder(node.right);
}
}
非递归:
public void preOrder_Stack(TreeNode root){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
while(node!=null||stack.size!=0){
if(node!=null){
System.out.println(node.val);
stack.push(node);
node = node.left;
}else{
node = stack.pop();
node = node.right;
}
}
}
中序遍历
左子树–>根–>右子树
递归:
public void inOrder(TreeNode root){
if(root!=null){
inOrder(root.left);
System.out.println(root.val);
inOrder(root.right);
}
}
非递归:
public void inOrder_Stack(TreeNode root){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
while(node!=null||stack.size!=0){
if(node!=null){
stack.push(node);
node = node.left;
}else{
node = stack.pop();
System.out.println(node.val);
node = node.right;
}
}
}
后序遍历
左子树–>右子树–>根
递归:
public void postOrder(TreeNode root){
if(root!=null){
postOrder(root.left);
postOrder(root.right);
System.out.println(root.val);
}
}
非递归:
public void postOrder_Stack(TreeNode root){
Stack<TreeNode> stack = new Stack<TreeNode>();
Stack<TreeNode> output = new Stack<TreeNode>();//构造一个中间栈来存储逆后续遍历的结果
TreeNode node = root;
while(node != null || stack.size()>0){
if(node != null){
output.push(node);
stack.push(node);
node = node.right;
}else{
node = stack.pop();
node = node.left;
}
}
while(output.size()>0){
System.out.println(output.pop().val);
}
}