其實我們可以借鑑層次遍歷時候的思路, 參見劍指offer–060-把二叉樹列印成多行, 我們把層次遍歷的結果儲存在vector< vector >中每一層儲存在乙個vector中, 那麼我們輸出的時候就可以進行調整, 按照之字形輸出即可
for(int i = 0; i if(i & 1)
}return ans;
完整**如下, 其中levelorder可以被替換成其他的層次遍歷的方法, 這裡我們就不詳細講了
#include
#include
#include
using
namespace
std;
#define __tmain main
#ifdef __tmain
#define debug cout
#else
#define debug 0 && cout
#endif // __tmain
#define undebug 0 && cout
#ifdef __tmain
struct treenode
};#endif // __tmain
class solution
if(ans.size( ) == p)
ans[p].push_back(proot->val);
levelorder(proot->left, p + 1);
levelorder(proot->right, p + 1);
}vector
< vector
> print(treenode* proot)
}return ans;
}};int __tmain( )
上面那種方法是在層次遍歷完成後的輸出過程進行轉換,這種處理對於海量資料就很雞肋了
當然我們也可以在層次遍歷的過程中就行轉換,在層次遍歷遍歷的過程中, 將元素的輸出順序即插入順序與其層數相關聯
我們之前提到過, 層次遍歷右多種方法, 我們可以在
對二叉樹進行層次遍歷, 設定乙個標識層數或者遍歷順序
處理每層的元素的時候, 按照遍歷順序進行從前往後遍歷或者從後往前遍歷
那麼為了更好的處理, 我們其實可以有很多種方法, 由於要雙向遍歷, 那麼我們就用雙端佇列deque儲存最為方便
關於層次遍歷的方法我們這裡不再詳述, 我們這裡採用的方式是在每層的結束插入乙個特殊標識(null), 來表示一層的結束
當然可以有其他方法, 但是基本思路相同, 而且層次遍歷只是本題的一部分, 關鍵是如何實現之字訪問
class solution
vector
curr;
deque
deq;
deq.push_back(null);//層分隔符
deq.push_back(proot);
bool lefttoright = true;
while (deq.size( ) != 1)
}else
// 從後往前遍歷
}lefttoright = !lefttoright;
ret.push_back(curr);
curr.clear();
deq.push_back(null);//新增層分隔符
continue;//一定要continue
}if (node->left != null)
if (node->right != null)
}return ret;
}};
也可以用兩個棧來儲存節點的每一層,
class solution
vector
curr;
stack
levels[2];
#define left_to_right 1 // 先左後右訪問, 意味著先右後左入棧
#define right_to_left 0 // 先右後左訪問, 意味著先左後右入棧
int current = left_to_right;
int next = right_to_left;
levels[current].push(proot);
while(levels[left_to_right].empty( ) != true
|| levels[right_to_left].empty( ) != true)
if(pnode->right != null)
}else
// 先右後左入棧
if(pnode->left != null)
}if(levels[current].empty( ) == true)
}return res;
}};
按之字形順序列印二叉樹
題目描述 按之字形順序列印二叉樹 請實現乙個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。解析 要分層列印,不能用常規方法,訪問乙個節點後,將該節點的左右子節點壓入佇列。奇數層從左到右列印,偶數層從右向左列印。使...
按之字形順序列印二叉樹
請實現乙個函式按照之字形順序列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三行再按照從左到右的順序列印,其他行以此類推。include iostream include stack using namespace std struct treenode void pri...
按之字形順序列印二叉樹
請實現乙個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。以題目中的二叉樹為例,一步步分析。當二叉樹的根結點 結點1 列印之後,它的左子結點 結點2 和右子結點 結點3 先後儲存到乙個容器中。值得注意的是,在列印第...