非遞迴一般都用到棧來實現
現在附上**,希望自己在面試的時候更加仔細嚴謹!
後序遍歷採用了乙個prevnode來記錄前乙個訪問的點,當取棧頂的乙個節點後,前乙個訪問的點如果是自己的右孩子的話,棧頂的點就可以輸出了,並把自己的值賦給prevnode,否則自己的右孩子還沒有被訪問,先訪問右孩子。
關鍵**:
if (p->right==null||p->right==prevnode)
else
下面是遞迴和非遞迴的全部**:
已通過空樹和一些普通樹的測試
void preorderrecursive(btn* root)
coutpreorderrecursive(root->left);
preorderrecursive(root->right);
}void inorderrecursive(btn* root)
inorderrecursive(root->left);
coutinorderrecursive(root->right);
}void preorder(btn* root)
stackstk;
stk.push(root);
while (!stk.empty())
return;
}void postorderrecursive(btn* root)
postorderrecursive(root->left);
postorderrecursive(root->right);
cout}void inorder(btn* root)
stackstk;
btn *p=root;
while(p||!stk.empty())
p=stk.top();
stk.pop();
coutp=p->right;
} return;
}void postorder(btn* root)
stackstk;
btn *p=root;
btn *prevnode=null;
while(p||!stk.empty())
p=stk.top();
if (p->right==null||p->right==prevnode)
else
} return;
}
二叉樹遍歷(遞迴 非遞迴)
二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。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次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...