zoukankan      html  css  js  c++  java
  • 需要必知必会,倒背如流的经典算法和实现

    二叉树的遍历算法(递归和迭代)

    #include <iostream>
    #include <stack>
    
    using namespace std;
    
    template <typename T>
    class BinaryTree
    {
    public:
            BinaryTree(){}
            class TreeNode
            {
            public:
                    TreeNode(){ visited = false;}
                    TreeNode* left;
                    TreeNode* right;
                    T value;
                    bool visited;
            };
            void Insert(T t);
            void InorderTraverse(TreeNode * begin);
            void PreorderTraverse(TreeNode * begin);
            void PostorderTraverse(TreeNode * begin);
            void InorderTraverse2();
            void PreorderTraverse2();
            void PostorderTraverse2();
    private:
            TreeNode *root;
            void Insert(TreeNode* root, T t);
    
    };
    
    template <typename T>
    void BinaryTree<T>::InorderTraverse(TreeNode * begin)
    {
            if(NULL != begin->left)
                    InorderTraverse(begin->left);
            cout<<begin->value;
            if(NULL != begin->right)
                    InorderTraverse(begin->right);
    }
    
    
    template <typename T>
    void BinaryTree<T>::PreorderTraverse( TreeNode * begin)
    {
            cout<<begin->value;
            if(NULL != begin->left)
                    PreorderTraverse(begin->left);
            if(NULL != begin->right)
                    PreorderTraverse(begin->right);
    }
    
    template <typename T>
    void BinaryTree<T>::PostorderTraverse(TreeNode * begin)
    {
            cout<<begin->value;
            if(NULL != begin->left)
                    PostorderTraverse(begin->left);
            if(NULL != begin->right)
                    PostorderTraverse(begin->right);
    }
    
    template <typename T>
    void BinaryTree<T>::InorderTraverse2()
    {
            stack<TreeNode *> treestack;
            treestack.push(root);
            TreeNode * tmpNode;
            while(!treestack.empty())
            {
                    tmpNode = treestack.top();
                    if(NULL == tmpNode->left || tmpNode->left->visited)
                    {
                            treestack.pop();
                            tmpNode->visited = true;
                            cout<<tmpNode->value;
                            if(NULL != tmpNode->right)
                            {
                                    treestack.push(tmpNode->right);
                            }
                    }
                    else if(!(tmpNode->left->visited))
                    {
                            treestack.push(tmpNode->left);
                    }
            }
            cout<<endl;
    }
    
    
    template <typename T>
    void BinaryTree<T>::PreorderTraverse2()
    {
            stack<TreeNode *> treestack;
            treestack.push(root);
            TreeNode * tmpNode;
            while(!treestack.empty())
            {
                    tmpNode = treestack.top();
                    treestack.pop();
                    cout<<tmpNode->value;
                    if(NULL != tmpNode->right)
                            treestack.push(tmpNode->right);
                    if(NULL != tmpNode->left )
                    {
                            treestack.push(tmpNode->left);
                    }
            }
            cout<<endl;
    }
    
    template <typename T>
    void BinaryTree<T>::PostorderTraverse2()
    {
    }
    
    template <typename T>
    void BinaryTree<T>::Insert(T t)
    {
            if(NULL == root)
            {
                    root = new TreeNode();
                    root->value = t;
            }
            else
            {
                    Insert(root,t);
            }
    }
    
    template <typename T>
    void BinaryTree<T>::Insert(TreeNode *root, T t)
    {
            if(t >= root->value)
            {
                    if(NULL != root->right)
                            Insert(root->right, t);
                    else
                    {
                            TreeNode *temp = new TreeNode();
                            temp->value = t;
                            root->right = temp;
                    }
            }
            else
            {
                    if(NULL != root->left)
                            Insert(root->left, t);
                    else
                    {
                            TreeNode *temp = new TreeNode();
                            temp->value = t;
                            root->left = temp;
                    }
            }
    }
    
    
    
    int main(int argc, char **argv)
    {
            BinaryTree<int> *bitree = new BinaryTree<int> ();
            bitree->Insert(9);
            bitree->Insert(7);
            bitree->Insert(8);
            bitree->Insert(1);
            bitree->Insert(6);
            bitree->Insert(4);
            bitree->Insert(5);
            bitree->Insert(2);
            bitree->Insert(3);
            bitree->Insert(10);
            bitree->Insert(11);
            bitree->InorderTraverse2();
            bitree->PreorderTraverse2();
    }

    二叉查找

    深度优选遍历

    DFS需要对每个节点保存一个状态,而这个状态可能是3个值:White(没有发现的), Gray(被发现,正在遍历的), Black(以遍历完成的). 所以DFS需要一个数据空间去存储每个节点的状态。就用2386为例子实现一个吧

    http://yangjunke111.blog.163.com/blog/static/135279606201041312753102/

    广度优先遍历

  • 相关阅读:
    我的利器
    老树新芽——矩估计遇到神经网络
    QuantLib 金融计算——数学工具之随机数发生器
    《Implementing QuantLib》译后记
    c# 大批量用户访问数据库报错
    阿里云redis映射到阿里云服务器
    C# 输出字符串到文本文件中
    SQL Server 怎么在分页获取数据的同时获取到总记录数
    C# 当前 .NET SDK 不支持将 .NET Core 2.1 设置为目标。请将 .NET Core 2.0 或更低版本设置为目标,或使用支持 .NET Core 2.1 的 .NET SDK 版本。
    c# 项目之间循环引用vs弹窗提醒
  • 原文地址:https://www.cnblogs.com/whyandinside/p/2893078.html
Copyright © 2011-2022 走看看