树根据扩展先序遍历建立二叉树及其非递归遍历

此部分是对于数据结构的边缘部分的理解

#include 
#include
 using namespace std;
 struct node
 {
     char data;
     node *leftchild;
     node *rightchild;
};
void Create(node *&p)//扩展先序遍历建立二叉树
{
    char ch;
    cin>>ch;
    if (ch=='#')
        p=NULL;
    else
    {
        p=new node;
        p->data=ch;
        Create(p->leftchild);
        Create(p->rightchild);
    }
}
void PreOrder(node *root)
{
    stacks;
    node *p;
    s.push(NULL);
    p=root;
    while(!s.empty())
    {
        if (p==NULL)
        break;
       cout<data<<" ";
       if (p->rightchild!=NULL)//如果右子树不为空,那么将右子树入栈
            s.push(p->rightchild);
       if (p->leftchild!=NULL)//如果左子树不为空,那么将当前节点迭代为它的左孩子
          p=p->leftchild;
       else//如果左子树为空,那么就从栈中取出一个节点
          {
           p=s.top();
           s.pop();
          }
    }
}
void PosrOrder(node *root)//中序遍历思路是先不断遍历左节点(只是遍历,并不访问,第一个访问应当是最左边的),如果该节点不为空则将其入栈,同时继续访问它的左节点,如果左节点为空了,就从栈中取出一个元素,输出它的值,同时将指针指向它的右节点
//注意这里是理解的难点,为什么要置为右节点,因为实际上该点的左子树已经访问过了,退回父节点由将父节点访问过了,此时要访问它的右子树,而访问右子树的过程应重复上述过程,即又是先重复访问左节点
{
    node *p=root;
    stacks;
   while(p||!s.empty())//正常应该是栈不为空,但考虑到第一次判断的情况(第一次肯定要将根节点入栈的),所以要让p不为空也放入,那后面会出现p为空但栈中没有元素的情况吗,显然不会,因为只要p不为空都只会往栈中加元素,根本不会取出元素
    {
       if (p)
       {
        s.push(p);
        p=p->leftchild;
       }
       else//当为空,就从栈中取出一个节点
       {
           p=s.top();
           s.pop();
           cout<data<<" ";
           p=p->rightchild;
       }
    }

}
int main()
{
    node *root;
    Create(root);
    cout<<"先序遍历结果为:";
    PreOrder(root);
    cout<

毫无疑问我的先序遍历的代码复杂了,单独上个简洁的代码~~


void PreOrderTraverse(BTNode *T, Status (*visit)(ElementType e))
{
    BTNode *stack[MAX_SIZE], *p;
    int top = -1;
    if(T != NULL)    {
        stack[++top] = T;
        while(top > -1)
        {
            p = stack[top--];
            visit(p->data);
            if(p->rchild != NULL)
            {
                stack[++top] = p->rchild;
            }
            if(p->lchild != NULL)
            {
                stack[++top] = p->lchild;
            }
        }
    }
}



你可能感兴趣的:(杂题)