网站 成功因素南京十大广告公司
web/
2025/10/4 2:48:28/
文章来源:
网站 成功因素,南京十大广告公司,网站换一个图片怎么做,免费下载的网页模板一、根据二叉树创建字符串 思路#xff1a;在正常前序递归遍历的基础上#xff0c;单独加上一个考虑到右子树为空的情况#xff0c;如下#xff1a;其结果为 1#xff08;2#xff08;4#xff08;5#xff09;#xff08;6#xff09;#xff09;#xff09;…一、根据二叉树创建字符串 思路在正常前序递归遍历的基础上单独加上一个考虑到右子树为空的情况如下其结果为 12456当遍历到节点2时由于2的左节点不为空右节点为空我们应该先打印根节点然后打印左子树。 class Solution {
public:string tree2str(TreeNode* root) {if(root nullptr) return ;if(root-left nullptr root-right nullptr) return to_string(root-val);if(root-right nullptr) return to_string(root-val) ( tree2str(root-left) );return to_string(root-val) ( tree2str(root-left) )( tree2str(root-right) );}
};
二、二叉树的层序遍历 思路 方法一BFS 用队列来写把每一层入队列出队列的第一个头节点然后把头节点所连节点加入队列中然后循环往复直到队列没有元素 方法二DFS 定义一个kans[k]表示每层的节点数组。 方法一 BFS
class Solution {
public:vectorvectorint levelOrder(TreeNode* root) {vectorvectorint vv;if(root NULL) return vv;queueTreeNode* q;q.push(root);while(!q.empty()){vectorint v;int size q.size();while(size--){TreeNode* node q.front();q.pop();v.emplace_back(node-val);if(node-left) q.push(node-left);if(node-right) q.push(node-right);}vv.push_back(v);}return vv;}
};
方法二DFS
class Solution {
public:void dfs(TreeNode* root, int k, vectorvectorint ans){if (root NULL) return;if (k ans.size()) ans.push_back(vectorint());ans[k].push_back(root-val);dfs(root-left, k 1, ans);dfs(root-right, k 1, ans);}vectorvectorint levelOrder(TreeNode* root) {vectorvectorint ans;dfs(root, 0, ans);return ans; }
};
三、二叉树的层序遍历II 思路 这道题要求从下到上输出每一层的节点值只要在层序遍历I稍作修改即可在遍历完一层节点之后将存储该层节点值的列表添加到结果列表的头部。 方法一、BFS
class Solution {
public:vectorvectorint levelOrderBottom(TreeNode* root) {vectorvectorint vv;if(root nullptr) return vv;queueTreeNode* q;q.push(root);while(!q.empty()){vectorint v;int n q.size(); //每一层的节点while(n--){TreeNode* Node q.front();q.pop();v.push_back(Node-val);if(Node-left) q.push(Node-left);if(Node-right) q.push(Node-right);}vv.push_back(v);}reverse(vv.begin(),vv.end());return vv;}
}; 方法二DFS
class Solution {
public:void dfs(TreeNode* root, int k, vectorvectorint ans){if (root NULL) return;if (k ans.size()) ans.push_back(vectorint());ans[k].push_back(root-val);dfs(root-left, k 1, ans);dfs(root-right, k 1, ans);}vectorvectorint levelOrderBottom(TreeNode* root) {vectorvectorint ans;dfs(root, 0, ans);reverse(ans.begin(), ans.end());return ans;}
};
四、二叉树最近公共祖先 思路 两个节点 p,q 分为两种情况 1、 p 和 q 在相同子树 2、p 和 q 在不同子树 从根节点遍历递归向左右子树查询节点信息。 递归终止条件如果当前节点为空或等于 p 或 q则返回当前节点 递归遍历左右子树如果左右子树查到节点都不为空则表明 p 和 q 分别在左右子树中因此当前节点即为最近公共祖先 如果左右子树其中一个不为空则返回非空节点。 class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if(root NULL || root p || root q) return root;TreeNode* l lowestCommonAncestor(root-left, p, q); //若在左子树则不为空TreeNode* r lowestCommonAncestor(root-right, p, q); //若在右子树则不为空if(l r) return root; //不在同一棵子树return l ? l : r; //在同一棵子树则返回子树的根节点即 p 或者 q}
}; 五、二叉搜索树和双向链表 思路 1、已知将二叉搜索树进行中序遍历可以得到由小到大的顺序排列因此本题最直接的想法就是进行中序遍历。 2、将中序遍历的结果用数组存储下来得到的数组是有从小到大顺序的。最后将数组中的结点依次连接即可。 3、但是根据题目的要求1不能创建新的结点而上述方法的数组中存储的其实是结点并不满足题意所以需要在中序遍历的过程中直接对结点的指针进行调整。4、调整的思路如下 1使用一个指针preNode指向当前结点root的前继。例如上述图中root为指向10的时候preNode指向8 2对于当前结点root有root-left要指向前继preNode中序遍历时对于当前结点root其左孩子已经遍历完成了此时root-left可以被修改。同时preNode-right要指向当前结点当前结点是preNode的后继此时对于preNode结点它已经完全加入双向链表。 class Solution {
public:TreeNode* preNode; //前继节点TreeNode* Convert(TreeNode* pRootOfTree) {if(pRootOfTree nullptr) return pRootOfTree;TreeNode* p pRootOfTree;while(p-left) p p-left; //找到双向链表的开头。Inorder(pRootOfTree);return p;}void Inorder(TreeNode* root){if(root nullptr) return;Inorder(root-left);root-left preNode;if(preNode) preNode-right root;preNode root;//更新preNode指向当前结点作为下一个结点的前继。Inorder(root-right);}
}; 六、从前序遍历和中序遍历序列构建二叉树 思路 由于前序遍历的性质可知其第一个节点为根节点然后我们通过该根节点再将中序遍历结果分开再来找节点如下图所示 DFS解法
class Solution {
private:unordered_mapint, int pos;public:TreeNode* dfs(const vectorint preorder, const vectorint inorder, int pl, int pr, int il, int ir) {if (pl pr) return nullptr;// 前序遍历中的第一个节点就是根节点int k pos[preorder[pl]]; // 在中序遍历中定位根节点// 先把根节点建立出来TreeNode* root new TreeNode(preorder[pl]);int len k - il;// 得到左子树中的节点数目// 递归地构造左子树并连接到根节点// 先序遍历中「从 左边界1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素root-left dfs(preorder, inorder, pl 1, pl len, il, k - 1);// 递归地构造右子树并连接到根节点// 先序遍历中「从 左边界1左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位1 到 右边界」的元素root-right dfs(preorder, inorder, pl len 1, pr, k 1, ir);return root;}TreeNode* buildTree(vectorint preorder, vectorint inorder) {int n preorder.size();// 构造哈希映射帮助我们快速定位根节点for (int i 0; i n; i) {pos[inorder[i]] i;}return dfs(preorder, inorder, 0, n - 1, 0, n - 1);}
}; 七、从中序和后序遍历序列构建二叉树 和上面代码思路差不多 class Solution {
public:unordered_mapint, int pos;TreeNode* dfs(vectorint inorder, vectorint postorder, int il, int ir, int pl, int pr){if(il ir) return nullptr; //递归截止int k pos[postorder[pr]]; //中序遍历确立根位置TreeNode* root new TreeNode(postorder[pr]); //创立根节点root-left dfs(inorder, postorder, il, k - 1, pl, pl k - 1 - il);root-right dfs(inorder, postorder, k 1, ir, pl k - il, pr - 1);return root; }TreeNode* buildTree(vectorint inorder, vectorint postorder) {int n inorder.size();for(int i 0; i n; i){pos[inorder[i]] i; //标记二叉树祖先遍历结果所对应下标}return dfs(inorder, postorder, 0, n - 1, 0 , n - 1);}
};
八、前序遍历非递归
给你二叉树的根节点 root 返回它节点值的 前序 遍历。
class Solution {
public:vectorint preorderTraversal(TreeNode* root) {vectorint ans;if(root nullptr) return ans;stackTreeNode* st;TreeNode* node root;while(!st.empty() || node ! nullptr){while(node!nullptr) {ans.push_back(node-val);st.push(node);nodenode-left;}node st.top();st.pop();node node-right;}return ans;}
}; 九、中序遍历非递归
给定一个二叉树的根节点 root 返回 它的 中序 遍历
class Solution {
public:vectorint inorderTraversal(TreeNode* root) {vectorint ans;stackTreeNode* s;while(root ! nullptr || !s.empty()){while(root ! nullptr){s.push(root);root root-left;}root s.top(); //取出第一个元素s.pop();ans.push_back(root-val);root root - right;}return ans;}
}; 十、后序遍历非递归
class Solution {
public:vectorint postorderTraversal(TreeNode* root) {vectorint ans;stackTreeNode* s;TreeNode* pre nullptr;while(root ! nullptr || !s.empty()){while(root ! nullptr){s.push(root);root root-left;}root s.top(); //取出第一个元素s.pop();if (root-right nullptr || root-right pre) {ans.push_back(root-val);pre root;root nullptr;} else {s.push(root);root root-right;}}return ans;}
};
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86554.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!