• Binary Tree_ basic algorithm


    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    // 三种遍历的递归实现
    
    void preOrder(TreeNode * root)
    {
       if(NULL == root ) return ;
       visit(root->val);
       preOrder(root->left);
       preOrder(root->right);
    }
    
    void inOrder(TreeNode * root)
    {
      if(NULL == root) return ;
      inOrder(root->left);
      visit(root->val);
      inOrder(root->right);
    }
    
    void postOrder(TreeNode * root)
    {
      if(NULL == root) return ;
      postOrder(root->left);
      postOrder(root->right);
      visit(root->val);
    }
    // 三种遍历的非递归实现
    
    void preOrder(TreeNode * root)
    {
       if(NULL == root ) return ;
       std::stack<TreeNode *> myStack;
       TreeNode *p = root;
    
       while(p || !myStack.empty())
       {
            while(p){
                visit(p->val);
                if(p->right)
                     myStack.push(p->right);
                p = p->left;
            }
          
            if(!myStack.empty())
            {
              p = myStack.top();
              myStack.pop();
            }
       }
    }
    
    void inOrder(TreeNode * root)
    {
      if(NULL == root) return ;
      std::stack<TreeNode *> myStack;
      TreeNode *p = root;
      
      while(p || !myStack.empty())
      {
        while(p)
        {
           myStack.push(p);
           p = p->left;
        }
        if(!myStack.empty())
        {
            p = myStack.top();
            myStack.pop();
            visit(p->val);
            p = p->right;
        }
      }
    }
    
    void postOrder(TreeNode * root)
    {
      if(NULL == root) return ;
      std::stack<TreeNode *> myStack;
      TreeNode *p = root,*leftNode, *rightNode, *q;
      
      while(P || !myStack())
      {
            while(p){
                 myStack.push(p); 
                 leftNode = p->left;
                 rightNode = p-> right;
                 p = (leftNode) ? leftNode: rightNode ;
            }
            p = myStack.top();
            myStack.pop();
            visit(p->val);
            if( !myStack.empty() )
              {
                 q = myStack.top();
                 if(p == q->left) 
                     p = q->right;
              }else
                    p = NULL:
      }
      
    }
    // 广度优先周游
    void levelOrder(TreeNode * root)
    {
       if(NULL == root ) return ;
       std::queue<TreeNode *> myQueue;
       TreeNode *p ;
       myQueue.push(root) ;
    
       while( !myQueue.empty())
       {
            p = myQueue.front();
            myQueue.pop();
            visit(p->val);
            if(p->left)
                  myQueue.push(p->left);
            if(p->right)
                  myQueue.push(p->right);
       }
    }
    --------------------------------------------------------------------天道酬勤!
  • 相关阅读:
    TCL环境检查
    POI之Excel文档增删改查
    wireshark自动化之tshark命令行
    selenium-webdriver
    ruby自动化之selenium webGUI
    TCL自动化之SSH交互式
    链表的操作
    参考网址
    RTC定时开机闹钟
    中断
  • 原文地址:https://www.cnblogs.com/graph/p/3013049.html
Copyright © 2020-2023  润新知