二叉树--广度优先遍历(bfs)与 深度遍历(dfs)

c++

Posted by YiMiTuMi on May 15, 2023

广度优先遍历(bfs)

利用队列的先进先出特性,先将根节点放到队列中,后遍历队列,依次将队列的首元素的左右孩子节点插入队列中后,将首元素删除。

//广度优先遍历(层序遍历) -- 借助队列 bfs
void TreeBreadthTraversal(TreeNode* root)
{
    if (root == NULL)
    {
        return;
    }

    //定义一个队列
    deque<TreeNode*> dequeTree;
    dequeTree.push_back(root);  //入队列根节点
    
    //循环队列
    while (dequeTree.size() != 0)
    {
        TreeNode* pTreeNode = dequeTree.front(); //获取队列首元素的值 

        //将该节点的左右节点保存到队列中
        if (pTreeNode->left != NULL) //左
        {
            dequeTree.push_back(pTreeNode->left);
        }

        if (pTreeNode->right != NULL) //右
        {
            dequeTree.push_back(pTreeNode->right);
        }

        //打印当前节点值
        cout << pTreeNode->val << endl;

        //删除第一个节点
        dequeTree.pop_front();
    }
}

深度遍历(dfs)

深度遍历可以遍历出每一个节点所在的区间,即节点的父子关系。

//深度遍历 -- 借助栈 dfs
int iTot = 0;
void TreeDepthTraversal(TreeNode* root)
{
    if (root == NULL)
    {
        return;
    }
    int iStart = 0; //开始区间
    int iEnd = 0;  //结束区间 

    //记录当前值所在的区间的开始位置
    iTot += 1;
    iStart = iTot;

    if (root->left != NULL)  //左子树
    {
        TreeDepthTraversal(root->left);
    }

	if (root->right != NULL)  //右子树
	{
		TreeDepthTraversal(root->right);
	}

    //记录当前值所在的区间的结束位置
    iTot += 1;
    iEnd = iTot;

    //打印区间
    printf("%d : [%d, %d] \n", root->val, iStart, iEnd);

    return;
}

节点的结构

struct TreeNode
{
	int val;
	TreeNode* left;
	TreeNode* right;
	//TreeNode() : val(0), left(nullptr), right(nullptr) {}
	//TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
	//TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {}

};