二叉樹列印所有的路徑 根據陣列構建完全二叉樹

2021-07-05 08:32:23 字數 1809 閱讀 3030

這道題目暫時沒想起來怎麼用遞迴去做,就用非遞迴吧。

這道題目是的位址是

主要是用了乙個vector來儲存節點資訊,這個節點資訊是對原來節點資訊的封裝,

增加了兩個單獨的引數,這兩個引數表示「左右子樹是不是存在以及是不是訪問過」

預設值是-1,取0表示有子樹且沒有訪問過,取1錶子樹已經訪問過。

基本邏輯是先沿著最左路徑訪問,不斷訪問不斷累加路徑上面的資料(列印用)。

當葉子節點列印完之後,要返回到最近的有右子樹的父或祖父節點。

然後開始輪詢其右孩子。這一步執行之前,要把跟節點到該「父或祖父節點」的資料都列印乙份。

這也就是用棧儲存的理由。

沒想到修改了乙個小地方就直接ac了,問題了我總是忘記判斷vector.size()>0就直接用vector.[vector.size()-1]。。修改的就是這樣地方。

全部**見下面。

另外這個方法不僅可以解決所有path問題,還可以解決的有

1:求是否存在乙個path,上面從根到葉子所有資料和為某值

2:列印『1』中所有的path

3:bfs即深度優先遍歷相關問題。

#include 

struct treenodectl

}; string m_itoa(int m)

; sprintf(a, "%d",m);//int數字轉為字串列印

return a;

}/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

vector

res;//返回值結構

vector

vcc;//始於根節點的已訪問節點棧

string strres = "";

while (1)

else

if (root->right && (vcc.size() ? root != vcc[vcc.size() - 1].node : 1))

else

if (root->right && (vcc.size() ? root == vcc[vcc.size() - 1].node : 0))

root = root->right;

vcc[vcc.size() - 1].right = 1;

}else

if (root->left == null && root->right == null)

}return res;

}};

構建完全二叉樹

void constructtree(treenode * & root, treenode * & parent, int

index, int *arr, int len)

treenode * lchild = null;

if (2 * index + 2>len) return;

else

treenode * rchild = null;

if (2 * index + 3>len) return;

else

if (2 * index + 2

<= len)

if (2 * index + 3

<= len)

}

呼叫時,可以如

root = null, parent = null,

constructtree(root,parent,0,arr, len);

列印二叉樹所有的路徑

問題 給乙個二叉樹,把所有的路徑都列印出來。比如,對於下面這個二叉樹,它所有的路徑為 8 3 1 8 2 6 4 8 3 6 7 8 10 14 13 思路 從根節點開始,把自己的值放在乙個陣列裡,然後把這個陣列傳給它的子節點,子節點同樣把自己的值放在這個陣列裡,又傳給自己的子節點,直到這個節點是葉...

ACM模式 根據陣列構造二叉樹

參考 前序 acm模式如何構建二叉樹.md 先根據資料列表獲得對應的節點列表 for i in range len nums node none if nums i 1 1指代是none node treenode nums i if i 0 root node 根據資料列表的關係,設定節點的lef...

陣列構建二叉樹(含有注釋)

任意二叉樹可以根據完全二叉樹性質儲存在乙個陣列中。已知二叉樹的陣列儲存,用程式構建該二叉樹。第一行輸入乙個整數t,表示有t個測試資料 第二行起輸入二叉樹的陣列儲存結果,空樹用字元 0 表示,輸入t行 陣列的資料由大寫字母和0表示 逐行輸出每個二叉樹的先序結果 3 abc0d abcdef000g a...