二叉树的前中后序遍历
递归方式:
1:确定递归函数的参数和返回值
2:确定终止条件
3:确定单层递归的逻辑
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
preorder(root, result);
return result;
}
public void preorder(TreeNode root, List<Integer> result) {//确定返回值
if (root == null) { //确定终止条件
return;
}
result.add(root.val); //前序遍历
preorder(root.left, result);
preorder(root.right, result);
}
}
二叉树的非递归前中后序遍历(迭代法)
class Solution { //前序遍历 进栈顺序:中左右
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result=new ArrayList<Integer>();
if(root==null){
return result;
}
Stack<TreeNode> stack=new Stack<>();
stack.push(root); //根节点先入栈
while(!stack.isEmpty()){ //根出栈,先存入数组中
TreeNode node=stack.pop();
result.add(node.val); //先右孩子再左孩子入栈
if(node.right!=null){
stack.push(node.right);
}
if(node.left!=null){
stack.push(node.left);
}
}
return result;
}
}
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result=new ArrayList<Integer>();
if(root==null){
return result;
}
Stack<TreeNode> stack=new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node=stack.pop();
result.add(node.val);
if(node.left!=null){
stack.push(node.left);//后续遍历只需要 调整一下 中左右,然后直接反转数组就可以得到后序遍历
}
if(node.right!=null){
stack.push(node.right);
}
}
Collections.reverse(result);
return result;
}
}
中序遍历的迭代法
前面的前序遍历,要处理的元素和遍历(遍历是先根再左或者右)的元素是一致的,所以可以同步处理,但是中序遍历却做不到,
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result=new ArrayList<Integer>();
Stack<TreeNode> stack=new Stack<>();
if(root==null){
return result;
}
TreeNode cur=root;
while(cur!=null||!stack.isEmpty()){
if(cur!=null){
stack.push(cur); //左子树一直遍历到底,栈依次存入便利的节点。然后弹出每个节点(弹出的顺序是先子节点再父节点),弹出的节点存入数组中,
cur=cur.left;
}else{
cur=stack.pop(); //遍历到底后,弹出栈(同时存入数组中),然后处理右节点
result.add(cur.val);
cur=cur.right;
}
}
return result;
}
}
标签:node,145,leetcode144,94,遍历,result,root,stack,cur
From: https://www.cnblogs.com/wdnmdp/p/16754683.html