1. 程式人生 > >二叉樹的前 中 後 層序遍歷

二叉樹的前 中 後 層序遍歷

|| 二次 node code style 成了 spa treenode 打印

  • 二叉樹的前序遍歷
    /*
    先將根節點打印,而後將右子節點入棧,最後將左子節點入棧
    循環得到棧頂,將其看作跟節點,再分別處理右子節點和左子節點
    */
     vector<int> preorderTraversal(TreeNode* root) {
            vector<int> vec;
            if(root != NULL)
            {
                stack<TreeNode*> stack;
                stack.push(root);
                while(!stack.empty())
                {
                    root 
    = stack.top(); vec.push_back(root->val); stack.pop(); if(root->right != NULL) { stack.push(root->right); } if(root->left != NULL) { stack.push(root
    ->left); } } } return vec; }

  • 二叉樹的中序遍歷
/*
從樹的跟開始一直將左子節點入棧,當節點為NULL時,說明是最左的節點,打印
而後將其右子樹作為一顆新樹進行以上邏輯
判斷退出條件是棧為NULL也就是所有的子樹都處理完成
*/ 
vector<int> inorderTraversal(TreeNode* root) {
        vector<int> vec;
        if( root != NULL )
        {
            stack
<TreeNode*> stack; while(!stack.empty() || root != NULL) { if(root != NULL) { stack.push(root); root = root->left; } else { root = stack.top(); stack.pop(); vec.push_back(root->val); root = root->right; } } } return vec; }
  • 二叉樹的後序遍歷
/*
因為最後才打印根節點,如果使用一個棧來處理,無法判斷當前訪問的根節點是第一次訪問還是第二次訪問,
所以使用了兩個棧,第一次訪問根節點是將其入棧,最後一遍出棧的時候就能保證是第二次訪問它
第一次將根節點入棧st2,而後將其左子節點入棧st1,右子節點入棧st1,再循環將st1內的棧頂當作根節點,
之所以是先入左再入右是因為從st1拿出根節點時要再壓入st2,所以最後從st2出棧的時候順序就變成了先左再右
*/
vector<int> postorderTraversal(TreeNode* root) {
        vector<int> vec;
        if(root != NULL)
        {
            stack<TreeNode*> stack1;
            stack<TreeNode*> stack2;
            stack1.push(root);
            while(!stack1.empty())
            {
                root = stack1.top();
                stack2.push(root);
                stack1.pop();
                if(root->left != NULL)
                {
                    stack1.push(root->left);
                }
                if(root->right != NULL)
                {
                    stack1.push(root->right);
                }
            }
            while(!stack2.empty())
            {
                vec.push_back(stack2.top()->val);
                stack2.pop();
            }
        }
        return vec;
    }
  • 二叉樹的遞歸寫法
/*
前序
*/
void
preorderTraversal(TreeNode* root) { if(NULL != root) { cout<<root->val<<endl; if(NULL != root->left) preorderTraversal(root->left); if(NULL != root->right) preorderTraversal(root->right); } }

二叉樹的前 中 後 層序遍歷