二叉树中的DFS和BFS

来源:互联网 发布:小岛秀夫离职原因知乎 编辑:程序博客网 时间:2024/06/02 05:31

二叉树遍历应该是二叉树中的基础了,二叉树遍历根据根节点的打印顺序又分为三种:

  • 前序遍历
  • 中序遍历
  • 后序遍历
    这三种遍历顺序,都是属于二叉树中的深度优先搜索(DFS),即每次都是先搜索到叶子节点,然后返回到其父节点,再继续向下搜索。因为中序遍历优先处理的是左节点,后序遍历优先处理的是右节点,前序遍历优先处理的是根节点。而层序遍历(即从左到右一层层的遍历)又属于二叉树中的广度优先搜索(BFS)。
    通过以上,我们可以看到二叉树遍历既可以用DFS、又可以用BFS实现。至于用哪个参考具体问题。
    DFS在二叉树中有两种实现方法:

  • 递归

  • 递归我这里就不说了,应该是很容易实现的。
    接下来说栈,栈这种结构是先进后出的,这是很符合DFS的搜索特点的,即先搜索到叶子节点,然后返回到其父节点,再继续向下搜索。以上不都是栈的特性吗?
    下面贴出中序遍历、后序遍历、前序遍历通过栈实现的代码:

  • Binary Tree Inorder Traversal

/*Definition for a binary tree node.*/struct TreeNode {    int val;    TreeNode *left;    TreeNode *right;    TreeNode(int x) : val(x), left(NULL), right(NULL) {}};vector<int> inorderTraversal(TreeNode* root) {    vector<int> res;    std::stack<TreeNode*> temp;    while (root || !temp.empty()) {        while (root) {            temp.push(root);            root = root->left;        }        root = temp.top();        temp.pop();        res.push_back(root->val);        root = root->right;    }    return res; }
  • Binary Tree Postorder Traversal
vector<int> postorderTraversal(TreeNode* root) {    vector<int> res;    std::stack<TreeNode*> temp;    while (root || !temp.empty()) {        while (root) {            temp.push(root);            //这里不用insert也可以的,可以像中序遍历一样把'res.push_back(root->val);' 放在'root = temp.top();'后面            res.insert(res.begin(),root->val);            root = root->right;        }        root = temp.top();        temp.pop();        root = root->left;    }    return res;}
  • Binary Tree Preorder Traversal
/*solution 1*/vector<int> preorderTraversal(TreeNode* root) {    vector<int> res;    std::stack<TreeNode*> temp;    while (root || !temp.empty()) {        while (root) {            temp.push(root);            res.push_back(root->val);            root = root->left;        }        root = temp.top();        temp.pop();        root = root->right;    }    return res;}/*solution 2*/vector<int> preorderTraversal(TreeNode *root) {    if (root==NULL) {        return vector<int>();    }    vector<int> result;    stack<TreeNode *> treeStack;    treeStack.push(root);    while (!treeStack.empty()) {        TreeNode *temp = treeStack.top();        result.push_back(temp->val);        treeStack.pop();        if (temp->right!=NULL) {            treeStack.push(temp->right);        }        if (temp->left!=NULL) {            treeStack.push(temp->left);        }    }    return result;}

而至于BFS在二叉树中目前看到的也是有两种方法:

  • 递归
  • 队列
    递归要在递归函数参数中传递现在的层数,而队列的实现,大部分代码同先序遍历的solution 2一样,只不过这次先压的是左节点,再压有节点。
0 0
原创粉丝点击