先序遍歷的順序是 根 左孩子 右孩子
public void dfs(node node)
system.out.println(node.val);
dfs(node.left);
dfs(node.right);
}}
遞迴的寫法還是挺簡單的,下面讓我們看一下非遞迴的寫法
非遞迴與遞迴的不同點在於非遞迴需要乙個棧來記錄節點
先根遍歷 是先列印根 那麼我們就直接把根節點進行列印,然後把他的孩子節點加入棧中,
我們需要先列印左子樹再列印右子樹,而棧具有先進後出的特性,那麼我們需要把右子樹先壓入棧中,之後在把左子樹壓入棧中。
//先序遍歷
stackassitstack = new stack<>();//輔助棧
assitstack.add(root);//把根節點壓入棧中
while (!assitstack.isempty())
if(popnode.left!=null)
}
中序遍歷的順序是 左孩子 根 右孩子
public void dfs(node node)
dfs(node.left);
system.out.println(node.val);
dfs(node.right);
}
中序遍歷 比先序遍歷還是稍微複雜一點。
因為我們先遍歷左子樹 所以我們不可以直接將節點拋棄,所以我們要判斷什麼時候將節點從棧中推出
所以我們需要乙個輔助節點來記錄還有沒有左子樹 如果沒有那麼我們就推出節點
stackmidassitstack = new stack<>();
node assitnode = root;
while (!midassitstack.isempty()||assitnode!=null)else
}
後序遍歷的順序是 左孩子 右孩子 根
public void dfs(node node)
dfs(node.left);
dfs(node.right);
system.out.println(node.val);
}
後序遍歷的話,會更加的複雜一些。後序遍歷和先序遍歷還是比較像的,讓我們來看一下先序遍歷,先序遍歷之所以會比較簡單和清楚的是因為我們不需要關心已經讀過的節點即父節點。在後序遍歷中我們需要儲存父節點的資訊,因此我們需要多乙個輔助棧來儲存讀過的節點。
我們知道後序遍歷輸出的順序是: 左右根,那麼第二個輔助棧的加入順序是根右左。
其中根節點我們是直接插入的所以不需要加入棧一
那麼棧一彈出順序是右左,其加入順序就是 左右(與先根相反)
//後序遍歷
stackbackassitstackone = new stack<>();
stackbackassitstacktwo = new stack<>();
backassitstackone.add(root);
node popnode;
while (!backassitstackone.isempty())
if(popnode.right!=null)
}while (!backassitstacktwo.isempty())
二叉樹遍歷(遞迴 非遞迴)
二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...
二叉樹非遞迴遍歷
二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...
非遞迴遍歷二叉樹
中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...