每日一題(12)

2021-08-25 02:52:38 字數 1753 閱讀 4417

分析:

1                          1

/ \ /

2 3 2

/ / \

\ 4 5 6 3

圖1 圖2

如果pnode為空,則不可能有後續結點,直接返回;

如果pnode的右子樹存在,中序次序下pnode的下乙個結點剛好為其右子樹中最左側結點

比如pnode在根節點的位置,該節點中序遍歷下的第乙個結點為5

因此如果pnode的右子樹存在,實際是求該節點右子樹中最左側結點

如果該結點的右子樹不存在,中序下第乙個結點:

可能為其雙親,比如圖1中的4結點,其中序下乙個結點為2

可能需要一直向上找雙親,比如圖2中的3結點,其中序下的第乙個結點為1

綜合兩種結果,相當就是檢測parent(pnode的雙親)右是否為pnode,如果是繼續向上找,否則pnode的下乙個結點找到pnode不是其雙親的右孩子為止

/*

struct treelinknode

};*/

class solution

else

// 最終找到結點為其雙親

pnode=

parent;

}return pnode;

}};

分析:

熟悉二叉樹前序&中序遍歷規則

前序遍歷規則:遍歷根節點—->遍歷根節點的左子樹—->遍歷根節點的右子樹

中序遍歷規則:遍歷根節點左子樹—->遍歷根的節點—->遍歷根節點的右子樹

前序:1 2 4 3 5 6 中序:4 2 1 5 3 6

從遍歷規則可知:前序遍歷結果:根節點一定是遍歷的第乙個結點

中序遍歷結果:根節點一定在左子樹之後右子樹之前遍歷

因此,可以從前序遍歷結果中找到二叉樹的根,從中序遍歷結果中找到二叉樹的左右子樹

思路 a. 取前序遍歷乙個元素,即根節點中資料

b. 在中序遍歷結果中找到a中所取元素的位置,按照該位置將序列分為左右兩部分,即根的左右子樹

c. 建立二叉樹的根節點(資料為a中所取資料)

按照b中所劃分區間:遞迴建立根左子樹

/**

* definition for binary tree

* struct treenode

* };

*/class solution

// 還原二叉樹根節點

treenode *proot=new treenode(pre[preindex]);

// 如果左區間存在還原根的左子樹

if(leftleft=_reconstructbinarytree(pre,++preindex,vin,left,rootindex);

}// 如果右區間存在,還原根的右子樹

if(rootindex+1

right=_reconstructbinarytree(pre,++preindex,vin,++rootindex,right);

}return proot;

}treenode* reconstructbinarytree(vector

pre,vector

vin)

};

每日一題 求1 2 n(中等)

劍指 offer 64.求1 2 n 求 1 2 n 要求不能使用乘除法 for while if else switch case等關鍵字及條件判斷語句 a?b c 示例 1 輸入 n 3 輸出 6 示例 2 輸入 n 9 輸出 45 class solution 邏輯運算子的短路效應 常見的邏輯...

每日一題 1

題目詳情 peter喜歡玩數字遊戲,但數獨這樣的遊戲對他來說太簡單了,於是他準備玩乙個難的遊戲。遊戲規則是在乙個n n的 裡填數,規則 對於每個輸入的n,從左上角開始,總是以對角線為起點,先橫著填,再豎著填。這裡給了一些樣例,請在樣例中找到規律並把這個n n的 列印出來吧。輸入描述 多組測試資料 資...

每日一題2018 3 21

leetcode 2 模擬十進位制運算考察單鏈表基本操作。題無難點,個人基礎需要提高。definition for singly linked list.struct listnode class solution while p while q if shi val s next null ret...