二叉樹的遍歷方式
先序遍歷(Pre-Order Traversal)
指先訪問根,然后訪問子樹的遍歷方式
中序遍歷(In-Order Traversal)
指先訪問左(右)子樹,然后訪問根,最后訪問右(左)子樹的遍歷方式
后序遍歷(Post-Order Traversal)
指先訪問子樹,然后訪問根的遍歷方式
遞歸實現
遞歸遍歷二叉樹非常簡單,這里不做贅述,先給出中序遍歷的代碼
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if(root != null) tra(root, ans);
return ans;
}
private void tra(TreeNode node, List<Integer> ans){
if(node.left != null) tra(node.left, ans);
ans.add(node.val);
if(node.right != null) tra(node.right, ans);
}
}
先序遍歷只需要將遞歸方法中的ans.add(node.val);放到最前面,后序遍歷只需要將遞歸方法中的ans.add(node.val);放到最后面就行。
非遞歸實現
前序遍歷
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
//用來保存結果的ArrayList.
List<Integer> ans = new ArrayList<>();
//用來存儲右邊節點的棧
Stack<TreeNode> rights = new Stack<>();
//遍歷到的當前的節點
TreeNode node = root;
while(node != null){
//將當前節點的值先放入結果
ans.add(node.val);
//如果當前節點的右邊子節點不為空,則將其壓入棧
if(node.right != null){
rights.add(node.right);
}
//將當前節點置為當前節點的左節點
node = node.left;
//此時若為空,則前一步作廢,將當前節點置為之前壓入棧的右邊的節點
if(node == null && !rights.isEmpty()){
node = rights.pop();
}
}
return ans;
}
}
中序遍歷
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode node = root;
while(node != null || !stack.empty()){
while(node != null){
stack.add(node);
node = node.left;
}
node = stack.pop();
ans.add(node.val);
node = node.right;
}
return ans;
}
}
后序遍歷
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<Integer> ans = new LinkedList<>();
Stack<TreeNode> stack = new Stack<>();
if(root == null) return ans;
stack.add(root);
while(!stack.empty()){
TreeNode node = stack.pop();
ans.addFirst(node.val);
if(node.left != null) stack.add(node.left);
if(node.right != null) stack.add(node.right);
}
return ans;
}
}