一般的な考え方:
実際には、ほとんどが「再帰」と、このバイナリツリーの問題は解決します。この質問は、私は再帰のアイデアを見つけることができませんでしたまだ始まったばかりです。
場合は、複数のノードがサブツリーである、あなたは明確に確認する必要があり、ルートノードは、前と後が何であるか終わりに。以下のような:
知っている可能性があり、これは、オーダーツリートラバーサルのものに合わせて明らかです。。
その後。。。長い時間のための分析。。。行きがけバイナリ・ソートツリーが最初に注文したので、そう実際には、行きがけ、ちょうどそれのコンテキストをリンクする前のノードを検討します!!
このコードは、また私は、しばらくの間勉強ポインタが参照変数で事前に注意を払います。コードの構造は、単に、事前にポインタがどのように変更する必要があります私は現在、何をすべきかを把握するために、構造の順トラバーサルです。
ACコード:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
//先判空和一个
if(pRootOfTree==NULL)
{
return NULL;
}
if(pRootOfTree->left==NULL && pRootOfTree->right==NULL)
return pRootOfTree;
TreeNode* pre = NULL;
convert_recursive(pRootOfTree,pre); //初始的pre值是null
TreeNode* p = pRootOfTree;
while(p->left)
p=p->left;
return p; //结果链表的头结点是树的最左下方的结点
}
void convert_recursive(TreeNode* t, TreeNode* &pre) //注意pre要加引用
{
if(t==NULL)
return;
convert_recursive(t->left,pre);
//仿照中序遍历,这里是主要的操作:
t->left=pre; //注意,这里要理解到!!!要等左子树以同样逻辑得到的pre作为本根节点的在链表中的上一个元素
if(pre) pre->right = t; //注意是双向链表!
pre = t; //这步也很关键
convert_recursive(t->right,pre);
}
};