二叉树之前序遍历、中序遍历、后续遍历
生活随笔
收集整理的這篇文章主要介紹了
二叉树之前序遍历、中序遍历、后续遍历
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
刷leetcode的時候,看到三道題:145. 二叉樹的后序遍歷、94. 二叉樹的中序遍歷、144. 二叉樹的前序遍歷。正好趁著這三道題,回顧一下二叉樹的遍歷算法。
- 二叉樹的前序遍歷:先遍歷根,再遍歷左子樹,再遍歷右子樹;
- 二叉樹的中序遍歷:先遍歷左子樹,再遍歷根,再遍歷右子樹;
- 二叉樹的后序遍歷:先遍歷左子樹,再遍歷右子樹,再遍歷根;
前中后遍歷是以根的順序區分的。
下面按照leetcode題目要求給出每個遍歷算法的遞歸和非遞歸程序。
在這三個題目里面,樹節點都是使用TreeNode表示的,代碼如下:
下面的代碼假設輸入的為下圖的樹:
144. 二叉樹的前序遍歷
前序遍歷的遞歸程序。
前序遍歷的非遞歸程序。
public class PreorderTraversal {public static void main(String[] args)throws Exception {PreorderTraversal code=new PreorderTraversal();TreeNode right=new TreeNode(2,new TreeNode(3),null);TreeNode root=new TreeNode(1,null,right);System.out.println(code.preorderTraversal(root));}public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res=new ArrayList<>();traverByNotRecursion(root,res);return res;}//非遞歸遍歷private void traverByNotRecursion(TreeNode root,List<Integer> list) {if(root==null){return ;}//使用stack模擬計算機棧List<TreeNode> stack=new ArrayList<>();stack.add(root);do{TreeNode node=stack.remove(stack.size()-1);list.add(node.val);//遍歷根if(node.right!=null){stack.add(node.right);//添加右子樹}if(node.left!=null){stack.add(node.left);//添加左子樹}}while(stack.size()!=0);} }94. 二叉樹的中序遍歷
中序遍歷的遞歸程序。
中序遍歷的非遞歸程序。
public class InorderTraversal {public static void main(String[] args)throws Exception {InorderTraversal code=new InorderTraversal();TreeNode right=new TreeNode(2,new TreeNode(3),null);TreeNode root=new TreeNode(1,null,right);System.out.println(code.inorderTraversal(root));}public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res=new ArrayList<>();traverByNotRecursion(root,res);return res;}//非遞歸遍歷private void traverByNotRecursion(TreeNode root, List<Integer> list) {if(root==null){return ;}//使用stack模擬計算機棧List<TreeNode> stack=new ArrayList<>();while(!stack.isEmpty()||root!=null){if(root!=null){stack.add(root);root=root.left;}else{root=stack.remove(stack.size()-1);list.add(root.val);root=root.right;}}} }145. 二叉樹的后序遍歷
后序遍歷的遞歸程序。
后序遍歷的非遞歸程序。
public class PostorderTraversal {public static void main(String[] args)throws Exception {PostorderTraversal code=new PostorderTraversal();TreeNode right=new TreeNode(2,new TreeNode(3),null);TreeNode root=new TreeNode(1,null,right);System.out.println(code.postorderTraversal(root));}public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res=new ArrayList<>();traverByNotRecursion(root,res);return res;}//非遞歸遍歷private void traverByNotRecursion(TreeNode root, List<Integer> list) {if(root==null){return ;}//使用stack模擬計算機棧List<TreeNode> stack=new ArrayList<>();TreeNode lastNode=null;//記錄最后一次訪問的節點while(!stack.isEmpty()||root!=null){while(root!=null){stack.add(root);root=root.left;}root=stack.get(stack.size()-1);//取棧頂元素if(root.right==null||root.right==lastNode){stack.remove(stack.size()-1);list.add(root.val);lastNode=root;root=null;}else{root=root.right;}}} }總結
以上是生活随笔為你收集整理的二叉树之前序遍历、中序遍历、后续遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SetCapture SetFocus
- 下一篇: Win11 右键风格改为 Win10风格