树的先序遍历

121 阅读1分钟

递归算法

先序遍历就是首先判断根结点是否为空,为空则停止遍历,不为空则将左子作为新的根结点重新进行上述判断,左子遍历结束后,再将右子作为根结点判断,直至结束。到达每一个结点时,打印该结点数据,即得先序遍历结果。

非递归算法

首先建立一个栈,当指针到达根结点时,打印根结点,判断根结点是否有左子和右子。有左子和右子的话就打印左子同时将右子入栈,将左子作为新的根结点进行判断,方法同上。若当前结点没有左子,则直接将右子打印,同时将右子作为新的根结点判断。若当前结点没有右子,则打印左子,同时将左子作为新的根结点判断。若当前结点既没有左子也没有右子,则当前结点为叶子结点,此时将从栈中出栈一个元素,作为当前的根结点,打印结点元素,同时将当前结点同样按上述方法判断,依次进行。直至当前结点的左右子都为空,且栈为空时,遍历结束。

算法流程图


程序

递归算法

void preOrder(Node *root)
{
    if(0 != root)
    {
        printf("%d",root->data);
        preOrder(root->lChild);
        preOrder(root->rChild)
    }
}

非递归算法

void PreOrderTraverse(BiTree T)
{
    stack<BiTree>Stack;
    if(!T)
    {
        printf("空树!\n");
        return;
    }
}
while(T || Stack.empty())
{
    while(T)
    {
        Stack.push(T);
        printf("%c",T->data);
        T=T->lchild;
    }
    T=Stack.top();
    Stack.pop();
        T=T->rchild;
}
}