這道題目暫時沒想起來怎麼用遞迴去做,就用非遞迴吧。
這道題目是的位址是
主要是用了乙個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...