-
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树
之间 的一对一映射关系的空括号对。
void _tree2str (struct TreeNode *t, char *str)
{
if (t == NULL)
return ;
char buff[12] = {'\0'};
sprintf (buff,"%d",t->val);
//把int型的t->val转化为字符串类型,结果保存在buff中。
strcat (str,buff);
//先判断左子树
if (t->left == NULL)
{
if (t->right == NULL)
return;
else
{
strcat (str,"()");
//拼接字符的时候,要用双引号引用!!!
}
}
else
{
strcat (str,"(");
_tree2str (t->left,str);
strcat (str,")");
}
//判断右子树
if (t->right == NULL)
return;
else
{
strcat (str,"(");
_tree2str (t->right,str);
strcat (str,")");
}
char* tree2str(struct TreeNode* t)
{
char *str = (char*)malloc(1024*1024);
_tree2str (t,str);
return str;
}
-
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
int TreeFind (struct TreeNode *root,struct TreeNode *node)
{
if (root==NULL)
return 0;
if (root==node)
return 1;
if (TreeFind(root->left,node))
return 1;
else if (TreeFind(root->right,node))
return 1;
else
return 0;
}
struct TreeNode* lowestCommonAncestor(struct TreeNode* root,
struct TreeNode* p, struct TreeNode* q)
{
if (root==NULL || p==NULL || q=NULL)
return NULL;
if (root==node)
return root;
int pintree = TreeFind(root->left,node);
int qintree = TreeFind(root->right,node);
if (pintree==1 && qintree==1)//如果两个结点都在左子树
return lowestCommonAncestor(root->left,p,q);
if (qintree==0 && qintree==0)//如果两个结点都在右子树
return lowestCommonAncestor(root->right,p,q);
else return root;//一个在左子树,一个在右子树
}
- 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
二叉搜索树(线索二叉树)要通过中序遍历转换成排序二叉树。
TreeNode *prev = NULL;
//把当前结点的前一个结点,每次都要置成空指针。
void _Convert(TreeNode *cur)
{
if (cur==NULL)
return;
_Convert(cur->left);//先转换左子树
cur->left = prev;//当前结点的上一个数是它的左孩子
//每次都以一个结点的左孩子开始
if(prev)
prev->right = cur;
prev = cur;
_Convert(cur->right);
}
TreeNode* Convert(TreeNode *pRootOfTree)
{
if(pRootOfTree==NULL)
return NULL;
_Convert(pRootOfTree);
TreeNode* head = pRootOfTree;
while (head && head->left){//找到二叉树最左端的结点。
head = head->left;}
return head;
}