二叉樹的第一部分演算法如下
下面是第二部分的二叉樹題目
(1)知道前序和中序之後,重建二叉樹
前序遍歷的特點是第乙個值為根節點,中序遍歷的值是根節點在中間,利用此規律對陣列進行分割歸併。
treenode* reconstructbinarytree(vectorpre,vectorvin)
}return root;
}
(2)二叉搜尋樹展開為雙向鍊錶
和二叉樹展開為鍊錶相似,遞迴演算法。
treenode* convert(treenode* prootoftree)
void converthelper(treenode* cur, treenode*& pre)
(3)左右檢視樹
以左檢視樹講解,代表從最左面能看到的結點,可以這樣做,先遍歷一次,map存放結點和層數,然後進行逆序更新,就是從右忘左更新,比如第三層有2個結點 左面的結點是x1,右面的結點是x2,map中的鍵值對應關係是去重複的,先載入了x2 map[3]=x2;這裡含義就是第三層能看到x2,逆序的最後把map[3]的值更新成了x1,這樣就實現了map中儲存的是各個層中 最左面的那個數。
void reupdate(vector&result) else
}// 清空原result
vector().swap(result);
// 將mp的結果放入result,並輸出結果
for(auto pair : mp)
}void preleftview(node & node, vector&result, const int deep = 0)
if(node.rightchiled != nullptr)
}// 左檢視生成函式
void leftview(node & node)
}
(4)判斷是不是二叉搜尋樹後序遍歷的結果
特點是 左節點比自己小,右結點比自己大。後序遍歷的話根節點在最後,對陣列進行遍歷,先公升後降,如果最後到達陣列末尾則這個結點符合規律,依次判斷全部結點。
這時候如果比較難理解的話不妨自己畫一棵樹模擬一下。
bool verifysquenceofbst(vectorsequence)
private:
vectorcur;
vector> res;
};
二叉樹相關演算法 二
leetcode 437.path sum iii 第乙個想法就是遍歷二叉樹,找出每個節點的可能性。這個思路時間複雜度為o n 2 private int num public intpathsum treenode root,int sum private void recur treenode ...
二叉樹相關演算法
節點 class node t public node t left public node t right public node t value,node t left,node t right public node t value this value,null null 二叉樹 前中後深度...
二叉樹練習
題目 給定兩個二叉樹,想象當你將它們中的乙個覆蓋到另乙個上時,兩個二叉樹的一些節點便會重疊。你需要將他們合併為乙個新的二叉樹。合併的規則是如果兩個節點重疊,那麼將他們的值相加作為節點合併後的新值,否則不為 null 的節點將直接作為新二叉樹的節點。示例 1 輸入 tree 1 tree 2 1 2 ...