【Algorithm&DataStructure】二叉查詢樹(BST)的遍歷
先序遍歷
/**
* 先序遍歷:遞迴實現
* @param root
*/
public void preOrderRe(TreeNode root){
System.out.print(root.val);
if(root.left != null) {
preOrderRe(root.left);
}
if(root.right != null) {
preOrderRe(root.right);
}
}
/**
* 先序遍歷非遞迴實現:堆疊
* @param root
* @return
*/
public void preOrder(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
while(root != null || !stack.isEmpty()) {
while(root != null) {
System.out.print(root.val);
stack.push(root);
root = root.left;
}
if(!stack.isEmpty()) {
root = stack.pop();
root = root.right;
}
}
}
中序遍歷
/**
* 中序遍歷遞迴實現
* @param root
*/
public void midOrderRe(TreeNode root){
if(root.left != null)midOrderRe(root.left);
System.out.print(root.val);
if(root.right != null)midOrderRe(root.right);
}
/**
* 中序遍歷非遞迴實現
* @param root
*/
public void midOrder(TreeNode root){
Stack<TreeNode> stack = new Stack<TreeNode>();
while(root != null || !stack.isEmpty()) {
while(root != null) {
stack.push(root);
root = root.left;
}
if(!stack.isEmpty()) {
root = stack.pop();
System.out.print(root.val);
root = root.right;
}
}
}
後序遍歷
/**
* 後序遍歷遞迴實現
* @param root
*/
public void postOrderRe(TreeNode root){
if(root.left != null)postOrderRe(root.left);
if(root.right != null)postOrderRe(root.right);
System.out.print(root.val);
}
/**
* 後序遍歷非遞迴實現
* @param root
*/
public void postOrder1(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
Stack<Integer> output = new Stack<Integer>(); //倒著存排序結果
while(root != null || !stack.isEmpty()) {
while(root != null) {
output.push(root.val);
stack.push(root);
root = root.right;
}
if(!stack.isEmpty()) {
root = stack.pop();
root = root.left;
}
}
while(!output.isEmpty()) {
System.out.print(output.pop());
}
}
層次遍歷
//使用陣列下標表示深度(深度遍歷+層次輸出)
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
support(pRoot,0);
return result;
}
public void support(TreeNode pRoot, int depth){
if(pRoot == null)return ;
if(depth >= result.size()){
result.add(new ArrayList<Integer>());
}
result.get(depth).add(pRoot.val);
support(pRoot.left,depth+1);
support(pRoot.right,depth+1);
}
/**
* 層次遍歷使用佇列
* @param root
*/
public void levelOrder(TreeNode root) {
if(root == null)return;
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.add(root);
while(!q.isEmpty()) {
int count = q.size();
while(count > 0) {
TreeNode temp = q.poll();
System.out.print(temp.val);
if(temp.left != null)q.add(temp.left);
if(temp.right != null)q.add(temp.right);
count--;
}
}
}
相關文章
- 二叉樹(BST)中序遍歷的三種方法二叉樹
- 二叉樹的遍歷二叉樹
- 二叉樹遍歷二叉樹
- 二叉樹---遍歷二叉樹
- 使用JS去實現一個BST(二叉查詢樹)JS
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- 完全二叉樹的遍歷二叉樹
- 玩轉二叉樹(樹的遍歷)二叉樹
- 『資料結構與演算法』二叉查詢樹(BST)資料結構演算法
- 二叉樹遍歷方法二叉樹
- 二叉樹遍歷 -- JAVA二叉樹Java
- C++樹——遍歷二叉樹C++二叉樹
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- 二叉樹的遍歷筆記二叉樹筆記
- 二叉樹的遍歷實現二叉樹
- 二叉樹的層序遍歷二叉樹
- 二叉樹的按層遍歷二叉樹
- 【LeetCode-二叉樹】二叉樹前序遍歷LeetCode二叉樹
- 迴圈遍歷二叉樹二叉樹
- 二叉樹四種遍歷二叉樹
- 6.14-二叉樹遍歷二叉樹
- 二叉樹--後序遍歷二叉樹
- 二叉樹的遍歷 → 不用遞迴,還能遍歷嗎二叉樹遞迴
- 二叉樹的遍歷 (迭代法)二叉樹
- 二叉樹的遍歷及應用二叉樹
- 144. 二叉樹的前序遍歷二叉樹
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 二叉樹遍歷方法總結二叉樹
- 二叉樹排序樹的建立,遍歷和刪除二叉樹排序
- 二叉樹的深度、寬度遍歷及平衡樹二叉樹
- 資料結構——樹與二叉樹的遍歷資料結構二叉樹
- 面試中很值得聊的二叉樹遍歷方法——Morris遍歷面試二叉樹
- Leetcode——144. 二叉樹的前序遍歷LeetCode二叉樹
- [LintCode]BinaryTreeLevelOrderTraversal(二叉樹的層次遍歷)二叉樹
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的前中後序遍歷二叉樹
- 二叉查詢樹