天梯賽L3 016 二叉搜尋樹的結構 (建樹)

2021-09-13 23:58:45 字數 2778 閱讀 7799

題目鏈結

l3-016 二叉搜尋樹的結構 (30 分)

給定一系列互不相等的整數,將它們順次插入一棵初始為空的二叉搜尋樹,然後對結果樹的結構進行描述。你需要能判斷給定的描述是否正確。例如將插入後,得到一棵二叉搜尋樹,則陳述句如「2是樹的根」、「1和4是兄弟結點」、「3和0在同一層上」(指自頂向下的深度相同)、「2是4的雙親結點」、「3是4的左孩子」都是正確的;而「4是2的左孩子」、「1和3是兄弟結點」都是不正確的。

輸入在第一行給出乙個正整數n(≤100),隨後一行給出n個互不相同的整數,數字間以空格分隔,要求將之順次插入一棵初始為空的二叉搜尋樹。之後給出乙個正整數m(≤100),隨後m行,每行給出一句待判斷的陳述句。陳述句有以下6種:

題目保證所有給定的整數都在整型範圍內。

對每句陳述,如果正確則輸出yes,否則輸出no,每句佔一行。

5

2 4 1 3 0

82 is the root

1 and 4 are siblings

3 and 0 are on the same level

2 is the parent of 4

3 is the left child of 4

1 is the right child of 2

4 and 0 are on the same level

100 is the right child of 3

yes

yesyes

yesyes

nono

no

【題意】

中文題面...題意很明白...思路也很清晰 但就是做不對 很氣!這道題必須寫一篇題解紀念一下

【解題思路】

先說一下幾個坑點:

①其實我最開始是用陣列做的,但100個點顯然是會爆棧的,然而資料很水過了。所以陣列做法肯定不現實,除非是用陣列模擬指標。

②既然用指標做就很容易出現段錯誤,先要確保訪問的兩個節點都在樹中,然後當要訪問左孩子是要保證左孩子非空,同理右孩子也是,不然就很容易段錯誤。

③節點不是正整數,有可能是負數,所以想要存節點的深度什麼的就一定要用map。

方法一:

常規思路,好像沒啥可說的..反正就是注意細節。

方法二:

在建樹的時候記錄每個節點的父節點,這樣就不用像上一種方法那樣寫這麼多搜尋函式了。

但是隨之會產生很多問題,就是前面坑點中的第二條,一定要注意細節!!如果出現段錯誤了,一般就是訪問了空節點。

【**】

方法一:

#includeusing namespace std;

int flag=0;

typedef struct node

node,*anode;

anode p;

anode insertnode(anode root,int x)

else if(xval)

root->left=insertnode(root->left,x);

else root->right=insertnode(root->right,x);

return root;

}anode findnode(anode root,int x)

}int judgeleft(anode root,int x,int y)

int judgeright(anode root,int x,int y)

void judgesibling(anode root,int x,int y)

}int getlevel(anode root,int x,int level)

}int main()

else printf("no\n");

}else//在同一層

else printf("no\n");}}

else

else if(str=="parent")

else printf("no\n");

}else if(str=="left")

else printf("no\n");

}else

else printf("no\n");}}

}}

方法二:

#includeusing namespace std;

typedef struct node

node,*anode;

maplevel;

mapfa;

anode insertnode(anode root,int x,int deep,anode pre)

else if(xval)

root->left=insertnode(root->left,x,deep+1,root);

else if(x>root->val)

root->right=insertnode(root->right,x,deep+1,root);

return root;

}int main()

else printf("no\n");

}else//在同一層

else printf("no\n");}}

else

else if(str=="parent")

else printf("no\n");

}else if(str=="left")

else printf("no\n");

}else

else printf("no\n");}}

}}

L3 016 二叉搜尋樹的結構

輸出樣例 yesyes yesyes yesno nono 題解 寫的 極醜。先離散化,建樹的時候儲存下來這個節點對應到陣列上的下標,a id i x,i是x的對映。上次有乙個題目也是這樣的查詢,但是那個是通過每次把所有的點for迴圈直至a i x,找到對應的陣列下標,時間複雜度較高。下面的 是錯誤...

L3 016 二叉搜尋樹的結構 (30 分

l3 016 二叉搜尋樹的結構 30 分 給定一系列互不相等的整數,將它們順次插入一棵初始為空的二叉搜尋樹,然後對結果樹的結構進行描述。你需要能判斷給定的描述是否正確。例如將插入後,得到一棵二叉搜尋樹,則陳述句如 2是樹的根 1和4是兄弟結點 3和0在同一層上 指自頂向下的深度相同 2是4的雙親結點...

L3 016 二叉搜尋樹的結構 30分

給定一系列互不相等的整數,將它們順次插入一棵初始為空的二叉搜尋樹,然後對結果樹的結構進行描述。你需要能判斷給定的描述是否正確。例如將插入後,得到一棵二叉搜尋樹,則陳述句如 2是樹的根 1和4是兄弟結點 3和0在同一層上 指自頂向下的深度相同 2是4的雙親結點 3是4的左孩子 都是正確的 而 4是2的...