题解 | 二叉搜索树 中序+先序/后序 唯一 确定一棵树

二叉搜索树

https://www.nowcoder.com/practice/3d6dd9a58d5246f29f71683346bb8f1b

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string>
using namespace std;

// 无需parent找父节点
struct TreeNode {
	char data;
	TreeNode* left;
	TreeNode* right;
};

// 创建二叉搜索/排序树
void InsertBST(TreeNode* &proot, char data) {
	TreeNode* pNew = new TreeNode;
	pNew->data = data;
	pNew->left = NULL;  // 叶子/新节点 左右指针默认为空
	pNew->right = NULL;

	if (proot == NULL) {
		proot = pNew;  // 新根结点
	}
	else {
		TreeNode* pCur = proot;  // pCur 向下探索
		TreeNode* pPre; // pPre指向pCur的父亲
		while (1) {
			if (pCur->data > data) {
				pPre = pCur;
				pCur = pCur->left;  // 指针往左走,左边小
				if (pCur == NULL) {  // 空结点
					pPre->left = pNew; // 新节点挂在父节点左边
					break;
				}
			}
			else {
				pPre = pCur;
				pCur = pCur->right;  // 指针往右走,右边大
				if (pCur == NULL) {  // 空结点
					pPre->right = pNew;   // 新节点挂在父节点右边
					break;
				}
			}
		}

	}

}

// 获取先序遍历 字符串表示
string PreOrder(TreeNode* proot) {
	if (proot == NULL) {  // 叶子节点下面
 		return "";  // 空串
	}
	// 自动连接字符串
	return proot->data + PreOrder(proot->left) + PreOrder(proot->right);
	// 这个是错误的,str会重复生成,最后只返回第一个栈帧的str
	//string str;
	//if (proot == NULL) {
	//	return "";  // 为空
	//}
	//str.push_back(proot->data + '0');  // + '0' int -> char
	//PreOrder(proot->left);
	//PreOrder(proot->right);
	//return str;
}

// 获取中序遍历 字符串表示
string InOrder(TreeNode* proot) {
	if (proot == NULL) {
		return ""; 
	}
	return  InOrder(proot->left) + proot->data + InOrder(proot->right);
}

// 非平衡二叉树。就是简单的二叉排序树,结点的高度没限制
int main() {
	int n;
	while (scanf("%d", &n) != EOF) {  // 先进入循环,再在里面找退出条件
		if ( n == 0 ) {
			break;  // 退出循环条件
		}
		char strArr[20] = { 0 };
		scanf("%s", strArr);
		TreeNode* proot1 = NULL;
		for (int i = 0; strArr[i] != '\0'; i++) {
			// - '0' char -> int
			//InsertBST(proot1, strArr[i] - '0');  // str[i] - '0' 数字字符转化为数字 
			InsertBST(proot1, strArr[i]);   // 字符 
		}
		string preOrder1 = PreOrder(proot1);
		string inOrder1 = InOrder(proot1);
		
		for (int i = 0; i < n;i++) {
			scanf("%s", strArr);  // 遍历序列长度相同
			TreeNode* proot2 = NULL;
			for (int j = 0; strArr[j] != '\0'; j++) {
				InsertBST(proot2, strArr[j]);   // 字符 
			}
			string preOrder2 = PreOrder(proot2);
			string inOrder2 = InOrder(proot2);
			
			// 字符串支持直接判断等于操作
			if (preOrder2 == preOrder1 && inOrder2 == inOrder1) {
				printf("YES\n");
			}
			else {
				printf("NO\n");
			}

			/*if(preOrder1.find(preOrder2)!= -1 && inOrder1.find(inOrder2) != -1){
				printf("YES\n");
			}else{
				printf("NO\n");
			}*/
		}

		return 0;
	}
	
}

#考研##复试练习#
2025考研复试 文章被收录于专栏

复试ing,努力中。。。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务