二叉樹的遍歷實現(遞歸和非遞歸)

二叉樹的遍歷(前序、中序和後序),遞歸和非遞歸的實現。前序和中序實現基本類似,後序稍微複雜一點,需要判斷當前節點的右子樹是否爲空或者已經訪問過,代碼如下:

//前序遍歷:遞歸
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 postorderTraversal1(TreeNode *root, vector<int> &path)
{
    stack<TempNode *> s;
    TreeNode *p = root;
    TempNode *temp;
    while(p != NULL || !s.empty())
    {
        while(p != NULL) //沿左子樹一直往下搜索,直至出現沒有左子樹的結點
        {
            TempNode *tempNode = new TempNode;
            tempNode->btnode = p;
            tempNode->isFirst = true;
            s.push(tempNode);
            p = p->left;
        }
        if(!s.empty())
        {
            temp = s.top();
            s.pop();
            if(temp->isFirst == true)   //表示是第一次出現在棧頂
            {
                temp->isFirst = false;
                s.push(temp);
                p = temp->btnode->right;
            }
            else  //第二次出現在棧頂
            {
                path.push_back(temp->btnode->val);
                p = NULL;
            }
        }
    }
}

//後序遍歷:非遞歸第二種
void postorderTraversal2(TreeNode *root, vector<int> &path)
{
    stack<TreeNode *> s;
    TreeNode *curr = NULL;
    TreeNode *last = NULL;

	s.push(root);
    while(!s.empty())
    {
		curr = s.top();
		if((curr->lchild == NULL && curr->rchild == NULL) || 
		  (last != NULL && (last == curr->lchild || last == curr->rchild))) 
		{
			path.push_back(curr->val);
			s.pop();
			last = curr;
		}
		else
		{
			 if(curr->rchild != NULL)
				 s.push(curr->rchild);
			 if(curr->lchild != NULL)
				 s.push(curr->lchild);
		}
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章