二叉樹的先序遍歷(遞迴和非遞迴)、中序遍歷(遞迴和非遞迴)、後序遍歷(非遞迴)及層次遍歷java實現
阿新 • • 發佈:2018-12-16
二叉樹的先序遍歷,遞迴實現:
public List<Integer> preorderTraversal(TreeNode root) { //用棧來實現 List<Integer> list = new ArrayList<Integer>(); PreOrderTraversal(root,list); return list; } public void PreOrderTraversal(TreeNode root,List<Integer> list) { if(root == null) return; list.add(root.val); if(root.left != null) PreOrderTraversal(root.left,list); if(root.right != null) PreOrderTraversal(root.right,list); }
二叉樹先序遍歷,非遞迴實現:
public static List<Integer> PreOrderTree(TreeNode root) { List<Integer> list = new ArrayList<Integer>(); if(root == null) return list; Stack<TreeNode> stack = new Stack<>(); TreeNode pCur = root; while(pCur != null || !stack.isEmpty()) { list.add(pCur.val); stack.push(pCur); pCur = pCur.left; while(pCur == null && !stack.isEmpty()) { pCur = stack.pop(); pCur = pCur.right; } } return list; }
二叉樹中序遍歷,遞迴實現:
public List<Integer> inorderTraversal(TreeNode root) { Stack<TreeNode> stack = new Stack<TreeNode>(); List<Integer> list = new ArrayList<Integer>(); inOrderTraversal(root,stack,list); return list; } public void inOrderTraversal(TreeNode root,Stack<TreeNode> stack,List<Integer> list) { if(root == null) return; stack.push(root); //先放根節點 if(root.left != null) inOrderTraversal(root.left,stack,list); //先判斷父節點的左子樹是否為空 list.add(stack.pop().val); //左子樹為空,那麼就將父節點壓出棧,儲存進list中 if(root.right != null) //然後是遍歷右子樹 inOrderTraversal(root.right,stack,list); }
二叉樹的中序遍歷,非遞迴實現:
public static List<Integer> InOrderTree(TreeNode root)
{
List<Integer> list = new ArrayList<>();
if(root == null)
return list;
Stack<TreeNode> stack = new Stack<>();
TreeNode pCur = root;
while(pCur != null || !stack.isEmpty())
{
stack.push(pCur);
pCur = pCur.left;
while(pCur == null && !stack.isEmpty())
{
pCur = stack.peek().right;
list.add(stack.pop().val);
}
}
return list;
}
二叉樹的後序遍歷,非遞迴實現:
public static List<Integer> PostOrderTree(TreeNode root)
{
List<Integer> list = new ArrayList<>();
if(root == null)
return list;
Stack<TreeNode> stack = new Stack<>();
Boolean flag = false; //判斷該節點是否已經被遍歷過
TreeNode pCur = root;
TreeNode temp = null;
while(pCur != null)
{
stack.add(pCur);
pCur = pCur.left;
if(pCur == null)
{
flag = true;
temp = null;
while(!stack.isEmpty() && flag == true)
{
pCur = stack.peek();
if(pCur.right == temp || pCur.right == null)
{
list.add(pCur.val);
temp = stack.pop();
}
else
{
pCur = pCur.right;
flag = false;
}
}
if(stack.isEmpty())
return list;
}
}
return list;
}
二叉樹的層次遍歷實現:
public ArrayList<ArrayList<Integer>> levelOrder(Node root) //層次遍歷
{
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
if(root == null)
return list;
Queue<Node> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty())
{
int levelNum = queue.size();
ArrayList<Integer> levelList = new ArrayList<>();
for(int i = 0; i < levelNum; i++)
{
Node temp = queue.poll();
levelList.add(temp.val);
if(temp.children != null)
for(Node ele : temp.children)
queue.add(ele);
}
list.add(levelList);
}
return list;
}