前序遍歷——遞歸和非遞歸實現

遞歸實現:

當節點不爲空時,每次遍歷現將節點值添加進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;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章