1、二叉树的非递归遍历
(1)非递归先序遍历 :(根--左---右)
思路:根据先序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。即对于任一结点,其可看作是根结点,因此可以直接访问,访问完之后,若其左孩子不为空,按照相同规则访问它的左子树;当访问其左子树完,再访问它的右子树;
对于任一结点:
(1)访问结点ptr,并将结点ptr入栈;
(2)判断结点的左孩子是否为空,若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点ptr,循环至1);若不为空,则将当前ptr的左孩子置为当前的ptr;
(3)直至ptr为空,或栈为空,则遍历结束;
void NicePreOrder(BtNode* ptr) //非递归先序遍历
{
if (ptr==NULL)
{
return;
}
stack<BtNode*>st;
while (!st.empty()||ptr!=NULL)
{
while (ptr!=NULL)
{
cout << ptr->data << " ";
st.push(ptr);
ptr = ptr->leftchild;
}
if (!st.empty())
{
ptr = st.top();
st.pop();
ptr = ptr->rightchild;
}
}
cout << endl;
}
(2)非递归中序遍历 :(左--根---右)
思路:由于中序遍历的顺序是:对于任一结点,先访问其左孩子,而左孩子又可以看作一根结点,然后继续访问其左孩子结点, 直至左孩子结点为空的结点才进行访问,然后按照相同的规则访问其右子树:
对于任一结点:
(1)若左孩子不为空,则将ptr入栈,并将ptr的左孩子置为当前ptr,然后再对当前结点ptr进行相同的处理;
(2)若左孩子为空,则取栈顶元素并进行出栈操作,访问该栈顶结点,然后将当前的ptr置为栈顶结点的右孩子;
(3)直到ptr为空或者栈为空则遍历结束
void NiceInOrder(BtNode* ptr) //非递归中序遍历
{
if (ptr == NULL)
{
return;
}
stack<BtNode*> s1;
while (ptr!=NULL||!s1.empty())
{
while (ptr)
{
s1.push(ptr);
ptr = ptr->leftchild;
}
ptr = s1.top();
s1.pop();
cout << ptr->data << " ";
ptr = ptr->rightchild;
}
cout << endl;
}
(3)非递归后序遍历 :(左--右---根)
思路:根据后序遍历的要求,要保证根结