> 文章列表 > 【堆的使用】【dfs构建数】二叉树遍历

【堆的使用】【dfs构建数】二叉树遍历

【堆的使用】【dfs构建数】二叉树遍历

二叉树遍历

        • 方法一:
        • 方法二:利用堆的性质

原题链接

方法一:

利用dfs构建树

因为这个前序遍历给了我们空的叶节点
所以我们可以只根据叶节点 构建树

abc##de#g##f
在这里插入图片描述
构建图如下

我们根据前序
abc##de#g##f

发现 dfs左子树 和 右子树
当出现#返回输出该父节点

继续递归右子树【但是我们发现如果继续递归右子树,得到的k还是左子树的位置的k】

所以我们在发现#时,需要将k++再返回具体如下代码

#include<iostream>using namespace std;string s;
int k;void dfs()
{if(s[k]=='#'){k++;return;}char ss = s[k++];dfs();cout << ss << ' ';dfs();
}int main()
{cin >> s;dfs();return 0;
}

方法二:利用堆的性质

abc##de#g##f
我们根据样例发现
遍历字符串,每次入堆
当出现#时,输出堆顶元素即可就是 中序遍历

#include<iostream>
#include<stack>using namespace std;string s;
stack<char> st;int main()
{cin >> s;for(int i = 0; i < s.size(); i++){if(s[i]=='#' && st.size()){cout << st.top() << ' ';st.pop();continue;}if(s[i]!='#'){st.push(s[i]);}}return 0;
}