程式設計練習 二叉樹相關演算法(二)

2021-09-25 12:47:12 字數 1242 閱讀 5227

二叉樹的第一部分演算法如下

下面是第二部分的二叉樹題目

(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 ...