普通二叉树的OJ题目(二)

普通二叉树的OJ题目(二)

  • T4、判断一棵树是否是另一颗树的子树
  • T5、二叉树的前序遍历,并保存在一个动态数组中
  • T6、二叉树的前序遍历构建,中序遍历打印

T4、判断一棵树是否是另一颗树的子树

//T4 另一颗树的子树
//给你两颗二叉树root 和subRoot。检验root中是否包含和 subRoot具有相同结构和结点值的子树。如果存在,返回true;否则,返回false.
//二叉树tree的一棵子树包含tree的某个节点和这个节点的所有后代结点。tree可以看做它自身的一棵子树。

bool isSameTree(struct TreeNode* p, struct TreeNode* q)
{
	if (NULL == p && NULL == q) //p、q均为空时
		return true;
	if (NULL == p || NULL == q)//p、q有一个为空时
		return false;

	if (p->val != q->val)  //p、q均不为空时
		return false;

	return isSameTree(p->left, q->left)
		&& isSameTree(p->right, q->right);
}

bool isSubTree(struct TreeNode* root, struct TreeNode* subRoot)
{
	if (NULL == root)
		return false;

	//遍历,跟root中所有子树都比较一遍
	if (isSameTree(root, subRoot))
		return true;

	return isSubTree(root->left, subRoot)
		|| isSubTree(root->right, subRoot);

}

T5、二叉树的前序遍历,并保存在一个动态数组中

//T5 二叉树的前序遍历
// 给你二叉树的根节点 root, 返回它节点值的前序遍历[放在一个大小为 *returnSize的数组中]。

int TreeSize(struct TreeNode* root)
{
	if (NULL == root)
	{
		return 0;
	}
	return TreeSize(root->left) + TreeSize(root->right) + 1;
}

void preorder(struct TreeNode* root, int* a, int* i)
{
	if (NULL == root)
		return;

	a[*i] = root->val;
	(*i)++;
	preorder(root->left, a, i);
	preorder(root->right, a, i);
}

int* preOrderTraversal(struct TreeNode* root, int* returnSize)
{
	*returnSize = TreeSize(root);
	int* a = (int*)malloc(*returnSize * sizeof(int));

	int i = 0;
	preorder(root, a, &i);

	return a;
}

T6、二叉树的前序遍历构建,中序遍历打印

//T6 二叉树遍历
//编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的先序遍历字符串:ABC##DE##,
//其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
//[此题的主要思路是将输入的字符串按照先序遍历的方式构建,再按照中序遍历的思路打印出来。]

#include 
#include 
#include 

typedef char BTDataType;
typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
	BTDataType data;
}BTNode;

BTNode* BuyNode(BTDataType x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	assert(node);

	node->data = x;
	node->left = NULL;
	node->right = NULL;

	return node;
}

BTNode* CreateTree(char* str, int* pi)
{
	if ('#' == str[*pi])
	{
		(*pi)++;
		return NULL;
	}

	BTNode* root = BuyNode(str[*pi]);
	(*pi)++;
	root->left = CreateTree(str, pi);
	root->right = CreateTree(str, pi);
	return root;
}


void InOrder(BTNode* root)
{
	if (NULL == root)
		return;

	InOrder(root->left);
	printf("%c ", root->data);
	InOrder(root->right);
}

int main()
{
	char str[100];
	scanf("%s", str);
	int i = 0;
	BTNode* root = CreateTree(str, &i);

	InOrder(root);
	return 0;
}

你可能感兴趣的:(数据结构)