二叉树递归/非递归遍历

来源:互联网 发布:中小型企业网络建设 编辑:程序博客网 时间:2024/06/03 16:01
/*递归遍历*///前序遍历void preorder(TreeNode *root, vector<int> &path){    if(root != NULL)    {        path.push_back(root->val);        preorder(root->left, path);        preorder(root->right, path);    }}//中序遍历void inorder(TreeNode *root, vector<int> &path){    if(root != NULL)    {        inorder(root->left, path);        path.push_back(root->val);        inorder(root->right, path);    }}//后续遍历void postorder(TreeNode *root, vector<int> &path){    if(root != NULL)    {        postorder(root->left, path);        postorder(root->right, path);        path.push_back(root->val);    }}/*非递归遍历*///非递归前序遍历void preorderTraversal(TreeNode *root, vector<int> &path){    stack<TreeNode *> s;    TreeNode *p = root;    while(p != NULL || !s.empty())    {        while(p != NULL)        {            path.push_back(p->val);            s.push(p);            p = p->left;        }        if(!s.empty())        {            p = s.top();            s.pop();            p = p->right;        }    }}//非递归中序遍历void inorderTraversal(TreeNode *root, vector<int> &path){    stack<TreeNode *> s;    TreeNode *p = root;    while(p != NULL || !s.empty())    {        while(p != NULL)        {            s.push(p);            p = p->left;        }        if(!s.empty())        {            p = s.top();            path.push_back(p->val);            s.pop();            p = p->right;        }    }}//非递归后序遍历-迭代void postorderTraversal(TreeNode *root, vector<int> &path){    stack<TreeNode *> s;    TreeNode *p = root;    TreeNode *pre = NULL;//保存上一次访问到的结点    while(p != NULL || !s.empty())    {        while(p != NULL) //沿左子树一直往下搜索,直至出现没有左子树的结点        {            s.push(p);            p = p->left;        }        if(!s.empty())        {            p = s.top();            if(p->right == NULL || p->right == pre)   //表明p的右子树都访问过了,接下来就是访问这个结点了            {                path.push_back(p->val);                pre = p;                s.pop(); p = NULL;//目的就是不让s再次压入p的左子树们            }            else            {                p = p->right;            }        }    }}

1 0
原创粉丝点击