分析:
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...