java實現二叉樹的遍歷(遞迴和非遞迴)
阿新 • • 發佈:2019-02-06
現有一顆如下圖所示的二叉樹:
其遍歷的各種方式如下:
構造一顆如下圖所示的二叉樹,用java實現其前序,中序,後序遍歷
注意二叉樹節點的定義如下:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
遞迴實現:
// 用遞迴的方法進行先序遍歷
public void qinaxuDigui(TreeNode treeNode) {
qianxuNumList.add(treeNode.val);
if (treeNode.left != null) {
qinaxuDigui(treeNode.left);
}
if (treeNode.right != null) {
qinaxuDigui(treeNode.right);
}
}
// 用遞迴的方法進行中序遍歷
public void zhongxuDigui(TreeNode treeNode) {
if (treeNode.left != null) {
zhongxuDigui(treeNode.left);
}
zhongxuNumList.add(treeNode.val);
if (treeNode.right != null) {
zhongxuDigui(treeNode.right);
}
}
// 用遞迴的方法進行後序遍歷
public void houxuDigui(TreeNode treeNode) {
if (treeNode.left != null) {
houxuDigui(treeNode.left);
}
if (treeNode.right != null) {
houxuDigui(treeNode.right);
}
houxuNumList.add(treeNode.val);
}
非遞迴實現:
// 用非遞迴的方法進行先序遍歷
public void qinaxuFeiDigui(TreeNode treeNode) {
Stack<TreeNode> stack = new Stack<TreeNode>();
while (treeNode != null || !stack.isEmpty()) {
while (treeNode != null) {
qianxuNumList.add(treeNode.val);
stack.push(treeNode);
treeNode = treeNode.left;
}
if(!stack.isEmpty()){
treeNode = stack.pop();
treeNode = treeNode.right;
}
}
}
// 用非遞迴的方法進行中序遍歷
public void zhongxuFeiDigui(TreeNode treeNode) {
Stack<TreeNode> stack = new Stack<TreeNode>();
while (treeNode != null || !stack.isEmpty()) {
while (treeNode != null) {
stack.push(treeNode);
treeNode = treeNode.left;
}
if (!stack.isEmpty()) {
treeNode = stack.pop();
zhongxuNumList.add(treeNode.val);
treeNode = treeNode.right;
}
}
}
// 用非遞迴的方法進行後序遍歷
public void houxuFeiDigui(TreeNode treeNode) {
Stack<TreeNode> stack = new Stack<TreeNode>();
while (treeNode != null || !stack.isEmpty()) {
while (treeNode != null) {
stack.push(treeNode);
treeNode = treeNode.left;
}
boolean tag = true;
TreeNode preNode = null; // 前驅節點
while (!stack.isEmpty() && tag == true) {
treeNode = stack.peek();
if (treeNode.right == preNode) { // 之前訪問的為空節點或是棧頂節點的右子節點
treeNode = stack.pop();
houxuNumList.add(treeNode.val);
if (stack.isEmpty()) {
return;
} else {
preNode = treeNode;
}
} else {
treeNode = treeNode.right;
tag = false;
}
}
}
}
執行結果如下: