算法流程:
1.先申请一个栈,记为stk。
2.然后将根节点压入stk中。
3.每次从stk中弹出栈顶节点,记为cur,然后打印cur的值。如果cur的右子树不为空,将cur的右子树压入stk中。如果cur的左子树不为空,将cur的左子树压入stk中。不断重复次步骤直到stk为空循环结束。
void Tree::Preorder(Node* root) {
stack<Node*>stk;
stk.push(root);
cout << "前序遍历" << endl;
while (!stk.empty()) {
Node* cur = stk.top();
cout << cur->val << " ";
stk.pop();
if (cur->right) {
stk.push(cur->right);
}
if (cur->left) {
stk.push(cur->left);
}
}
}
1.申请一个栈记为stk,申请一个变量cur,cur被根节点初始化。
2.把cur节点压入栈中,对以cur节点为根节点的整棵子树,依次把整棵树的左边界压入到栈中,即不断的执stk.push(cur)?;?cur?=?cur->left;直到cur为空停止本次循环。
3.上面循环停止后,弹出栈顶节点,记录为node,打印node,并且让cur=node->right;然后继续重复步骤2。
4.直到stk为空并且cur也为空时,停止整个循环。
void Tree::Inorder(Node* root) {
Node* cur = root;
stack<Node*>stk;
cout << endl;
cout << "中序遍历"<<endl;
while (cur||!stk.empty()) {
while(cur){
stk.push(cur);
cur = cur->left;
}
Node* Node = stk.top();
stk.pop();
cout << Node->val << " ";
cur = Node->right;
}
1.申请两个栈,记为S1和S2,然后将头结点压入S1中。
2.从s1中弹出的节点记为cur;然后先把cur的左子树压入到s1中,然后把cur的右子树压入到s1中。每一个从S1中弹出的节点都放进S2中。
3.不断重复步骤2,直到S1为空,整个过程结束。
void Tree::Postorder(Node* root) {
stack<Node*>S1;
stack<Node*>S2;;
S1.push(root);
cout << endl;
cout << "后序遍历" << endl;
while (!S1.empty()) {
Node* cur = S1.top();
S2.push(cur);
S1.pop();
if (cur->left) {
S1.push(cur->left);
}
if (cur->right) {
S1.push(cur->right);
}
}
while (!S2.empty()) {
cout << S2.top()->val << " ";
S2.pop();
}
}