前序遍历——递归和非递归实现

递归实现:

当节点不为空时,每次遍历现将节点值添加进list,之后,左子树补空,遍历左子树;右指数不空,遍历右子树;最终返回list。需要注意的是根节点为空的情况,在遍历之前,根节点为空,直接返回(全局)list。

//前序遍历递归排序
    public class solution{
        ArrayList<Integer> list = new ArrayList<>();
        public ArrayList<Integer> preOrderTraveral(TreeNode root){
            if(root==null)
                return list;
            list.add(root.val);
            if(root.left!=null)
                preOrderTraveral(root.left);
            if(root.right!=null)
                preOrderTraveral(root.right);
            return list;
        }
    }

非递归实现:

主要采用数据结构栈来辅助实现。每pop一个节点(当前根节点),前提是栈不为空,先将节点右孩子入栈,再将左孩子入栈(前提是孩子存在),依次pop及push。

//前序遍历非递归排序(用栈实现)
    public class solution{
        ArrayList<Integer> list = new ArrayList<>();
        public ArrayList<Integer> preOrderTravel(TreeNode root){
            if(root==null)
                return list;
            Stack<TreeNode> stack = new Stack<>();
            stack.push(root);
            while(!stack.isEmpty()){
                TreeNode temp = stack.pop();
                if(temp.right!=null)
                    stack.push(temp.right);
                if(temp.left!=null)
                    stack.push(temp.left);
            }
            return list;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章