leetcode94 (in-order traversal of binary tree)

Given a binary tree, return its mid-order traversal.

Example:
Input: [1,null,2,3]
Output: [1,3,2]

Solution (1): It is very simple to use DFS deep search recursive algorithm for middle order traversal

class Solution {
    
    
     private final List<Integer>res=new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
    
    
           DFS(res,root);
           return res;
    }
    private void DFS(List<Integer>res,TreeNode node){
    
    
        if(node==null)
            return;
        DFS(res,node.left);
        res.add(node.val);
        DFS(res,node.right);
    }
}

Solution (2): If DFS recursion is not used, we can use the stack to implement the algorithm

import java.util.*;
class Solution {
    
    
    public List<Integer> inorderTraversal(TreeNode root) {
    
    
 List<Integer>res=new Vector<>();
         TreeNode node = root;
         Stack<TreeNode> DFS = new Stack<>();
         while (!DFS.isEmpty() || node != null) {
    
    
             while (node != null) {
    
    
                 DFS.push(node);
                 node = node.left;
             }
             node = DFS.pop();
             res.add(node.val);
             node=node.right;
         }
         return res;
    }
}

Problem solution (3): Morris algorithm , Morris algorithm does not need to be implemented recursively, nor does it need to use a stack, which optimizes the space complexity to O(1).

class Solution {
    
    
    public List<Integer> inorderTraversal(TreeNode root) {
    
    
        List<Integer>res=new ArrayList<>();
        //Morris算法
        TreeNode node=root;
        TreeNode backTrace=null;
        while(node!=null){
    
    
            if(node.left!=null){
    
    
                backTrace=node.left;
                while(backTrace.right!=null&&backTrace.right!=node)
                    backTrace=backTrace.right;
                if(backTrace.right==null){
    
    
                    backTrace.right=node;
                    node=node.left;
                }
                else{
    
    
                    backTrace.right=null;
                    res.add(node.val);
                    node=node.right;
                }
            }
            else{
    
    
                res.add(node.val);
                node=node.right;
            }
        }
        return res;
    }
}

Guess you like

Origin blog.csdn.net/CY2333333/article/details/108571602