首页 > 其他分享 >带重复节点的前序中序二叉树

带重复节点的前序中序二叉树

时间:2022-12-23 20:45:21浏览次数:42  
标签:preorder right res 中序 vector 二叉树 inorder 前序 left

已知一个二叉树的先序遍历序列和中序遍历序列,但其中一些节点的值可能相同。请你返回所有满足条件的二叉树。二叉树在数组中的顺序是任意的。

输入
[1,1,2],[1,2,1]
输出
[{1,1,#,#,2},{1,#,1,2}]

麻烦的是最后构造出的二叉树不唯一了

看起来并不高明,能过但是我没能写出来的代码

class Solution {

public:

	vector<TreeNode*> myBuildTree(const vector<int>& preorder,const vector<int>& inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {
		vector<TreeNode*> res;
		
		if (preorder_left > preorder_right) {
			res.push_back(nullptr);
			return res;
		}

		for (int i = inorder_left; i <= inorder_right; i++) {
			// 在中序遍历序列中查找可能的根节点的索引
			if (inorder[i] == preorder[preorder_left]) {
				int size_of_leftsub = i - inorder_left;
				vector<TreeNode*> left = myBuildTree(preorder, inorder,preorder_left + 1, preorder_left + size_of_leftsub, inorder_left, i - 1);
				vector<TreeNode*> right = myBuildTree(preorder, inorder,preorder_left + size_of_leftsub + 1, preorder_right, i + 1, inorder_right);

				for (TreeNode* left_child : left) {
					for (TreeNode* right_child : right) {
						TreeNode* root = new TreeNode(preorder[preorder_left]);
						root->left = left_child;
						root->right = right_child;
						res.push_back(root);
					}
				}
			}
		}
		return res;
	}

	vector<TreeNode*> getBinaryTrees(vector<int>& preOrder, vector<int>& inOrder) {
		vector<TreeNode*> res;
		int n = preOrder.size();
		res = myBuildTree(preOrder,inOrder, 0, n - 1, 0, n - 1);
		return res;
	}
};

标签:preorder,right,res,中序,vector,二叉树,inorder,前序,left
From: https://www.cnblogs.com/yaocy/p/17001583.html

相关文章

  • 力扣-105-从前序与中序遍历序列构造二叉树/剑指Offer-07
    基本步骤是这样:先看先序序列,可以确定根节点,然后在中序遍历中就可以将二叉树划成左子树和右子树两拨对左右子树递归上述步骤好像直到怎么遍历二叉树,却对怎么重建二叉树......
  • 二叉树神级遍历!(Morris)
      我们之前说了二叉树基础及二叉的几种遍历方式及练习题本文大纲前序遍历前序遍历的顺序是,对于树中的某节点,先遍历该节点,然后再遍历其左子树,最后遍历其右子树......
  • 学过,以前做过,所以顺带也做了迭代方法遍历二叉树
    前序遍历/***<ahref="https://leetcode.cn/problems/binary-tree-preorder-traversal/">144.二叉树的前序遍历</>*<p>*中左右*/publ......
  • 【算法实践】他山之石,可以攻玉--利用完全二叉树快速实现堆排序
    前言什么是堆堆是一种数据结构,它是完全二叉树或者是近似完全二叉树的一种数据结构,树中每个结点的值都不小于(或不大于)其左右孩子结点的值。何为完全二叉树完全二叉树是一种......
  • 求二叉树的深度
    求二叉树的深度TimeLimit:1000MSMemorylimit:65536K题目描述已知一颗二叉树的中序遍历序列和后序遍历序列,求二叉树的深度。输入T组数据。每组数据包括两个长......
  • 数据结构实验之求二叉树后序遍历和层次遍历
    数据结构实验之求二叉树后序遍历和层次遍历TimeLimit:1000MSMemorylimit:65536K题目描述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历。输入......
  • 数据结构-二叉树遍历非递归
    前序遍历voidpreorder(BTNODEBT){BTNODESTACK[100];inttop=-1;STACK[++top]=BT;BTNODEp=null;while(top!=-1){BTNO......
  • 二叉树的最大/最小深度
    1.深度与高度二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)二叉树节点的高度:指从该节点到叶子节点的最长简单路径......
  • LeetCode 102_二叉树的层序遍历
    LeetCode102:二叉树的层序遍历题目给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。示例1:输入:root=[3,9,20,null,null,15,7]......
  • 剑指offer 二叉树的深度(C++)
    题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。代码实现/*structTreeNode{intval;......