struct treenode
};
遞迴寫法很水,這裡就不在展開描述了,直接貼**。
void preorder(treenode* head)
cout << head->val; //中
preorder(head->leftchild); //左
preorder(head->rightchild); //右
}
void inorder(treenode* head)
inorder(head->leftchild); //左
cout << head->val; //中
inorder(head->rightchild); //右
}
void postorder(treenode* head)
postorder(head->leftchild); //左
postorder(head->rightchild);//右
cout << head->val; //中
}
void preorder(treenode* head)
stackstack_tree;
stack_tree.push(head);
while (!stack_tree.empty())
if (head->leftchild)
}}
中序遍歷就不像先序遍歷那麼好理解了。
void inorder(treenode* head)
else
}}}
中序遍歷的順序是左中右,所以我們就有三個原則對應上面的**:
給定乙個頭結點,如果這個節點不為空,我們就一直往左找(壓棧)
如果當前節點為空,從棧中彈出乙個,並列印,然後節點向右判斷(彈出的節點的右孩子。)注意:這裡遍歷的順序是左中右。如果右節點為空就說明當前這顆子樹已經遍歷完了,就彈出這個子樹的父節點。
如果當前節點不為空,節點入棧,並接著找當前節點的左孩子
非遞迴的後序遍歷有多種實現方式,這裡列了乙個很好理解的例子。思路:後序遍歷是左右中,那麼我們按中右左的順序壓棧到_data棧,然後把_data棧中的元素彈出,放到_help,輸出_help棧的順序就是左右中。
void postorder(treenode* head)
stack_datastack;
stack_helpstack;
_datastack.push(head);
while (!_datastack.empty())
if (head->leftchild != nullptr)
} while (!_helpstack.empty())
}
滿二叉樹一定是平衡二叉樹,平衡二叉樹不一定是滿二叉樹。遞迴函式對於數來說可以回到乙個節點三次,通過左右子樹的遞迴呼叫來判斷左右是否平衡。以每乙個節點作為頭結點的數都是平衡二叉樹,那麼這棵樹就是平衡的。
對於乙個節點是否平衡,有四個資訊需要考察:1>這個節點的左子樹是否平衡。2>這個節點的右子樹是否平衡。3>如果子樹都平衡,那麼兩個子樹的高度差是否平衡。所以在遞迴的過程中需要返回兩個資訊,是否平衡,以及高度
列出可能性,整理出返回值型別
判斷一顆數是否是搜尋二叉樹:中序遍歷是否是乙個公升序陣列,否則就不是。
寫在後面:
這裡放一點自己學習二叉樹時的一些理解,有些問題可能理解的不是很對,請不要照搬照抄。
1>
壓棧的實質就是我需要讓我的子過程給我返回結果。棧結構是先進後出,特別適合二叉樹的遍歷。所以我們可以自己搞乙個棧,來存放自己需要用到的資訊。
2>
一棵樹是可以被分解成左邊界
資料結構之二叉樹實現
1.二叉樹的原理分析 樹是一種重要的非線性資料結構,直觀地看,它是資料元素 在樹中稱為結點 按分支關係組織起來的結構。二叉樹 binary tree 是每個節點最多有兩個子樹的有序樹。通常子樹被稱作 左子樹 和 右子樹 二叉樹演算法的排序規則 1 選擇第乙個元素作為根節點 2 之後如果元素大於根節點...
資料結構之二叉樹 C 二
目錄 table of contents 類的部分實現 二叉樹是一種特殊的樹,在上一節中也介紹了樹的其他形式,例如 霍夫曼樹,b樹等。其中,二叉樹的常用操作有 1.確定樹高 2.確定元素數目 3.複製 4.顯示或列印二叉樹 5.確定兩顆二叉樹是否一樣 6.刪除整顆樹 這些操作都可以通過有步驟的遍歷二...
資料結構之二叉樹
在二叉樹中每個節點最多只能有兩個子節點。即左子節點和有子節點。在二叉樹中最重要的操作應當是遍歷。即按照某一順序訪問二叉樹中的每乙個節點。一般有如下幾種遍歷方法 1 前序遍歷,即先訪問根幾點,然後再訪問左子節點,最後訪問右子節點。2 中序遍歷,即先訪問左子節點,然後再訪問根節點,最後訪問右子節點。3 ...